sed的if-else條件處理
sed -n '/bsp/!p' file
sed -n '/bsp/!d' file
!號(hào)不是修飾p而是修飾前面的匹配模式的xxx辆亏,可以這么理解嗎?, 忽略大小寫(xiě)的I選項(xiàng)也同理
cat work.txt |\
sed -n '/tag_a/,/tag_b/{
p;
/tag_b/a
}' #打印tag_a到tag_b之間的內(nèi)容,并在tag_b之后加入一個(gè)空行骨稿,支持有多個(gè)這種段落
cat work.txt |\
sed -n '/tag_a/,/tag_b/!{
p;
}' -e '/tag_b/a'#打印除了tag_a到tag_b之間的內(nèi)容笨鸡,即提出tag_a到tag_b直接的內(nèi)容,支持有多個(gè)這種段落
t是條件跳轉(zhuǎn)坦冠,如果匹配成功則跳轉(zhuǎn)到a形耗,if(true)-else,T則是匹配失敗則跳轉(zhuǎn)辙浑,if(false)-else
sed "/ccc/s/$/\tYES/;ta;s/$/\tNO/;:a" test.txt
如果table在前面激涤,可以實(shí)現(xiàn)循環(huán)
b是無(wú)條件跳轉(zhuǎn)到a,同goto
sed "/ccc/s/$/\tYES/;ba;s/$/\tNO/;:a" test.txt
sed -n "/ccc/ \
{
s/$/\tYES/;
a\new line
p;
};
t end;
s/$/\tNO/p;
:end" \
test.txt
sed -n "/ccc/I\
{
s/$/\tYES/
p
b end;
}
{
s/$/\tNO/p
}
:end" \
test.txt
sed -n "/ccc/ \
{
s/$/\tYES/; #實(shí)現(xiàn)行尾追加判呕,同理實(shí)現(xiàn)行首添加???
a\new line
p;
};
bend; #強(qiáng)制跳轉(zhuǎn)倦踢,相當(dāng)于此句和目標(biāo)tag之間的命令沒(méi)有
s/$/\tNO/p;
:end" \
test.txt
sed "/abc/ \
{
s/$/\ttrue/;
b end;
}
s/$/\tfalse/;
:end
" ${file}
#匹配成功的行后添加\ttrue,匹配失敗的行后添加\tfalse侠草,即:首行的模式匹配后的{}是整體執(zhí)行的辱挥。
sed "/abc/ \
s/$/\ttrue/;
b end;
s/$/\tfalse/;
:end
" ${file}
#只會(huì)在匹配成功的行后面添加\ttrue,匹配失敗的行沒(méi)有行為梦抢,即:b end這一句是獨(dú)立的般贼,每次都執(zhí)行愧哟。
滿足條件后奥吩,多操作同時(shí)處理
sed -n "/^tcp/I{ #匹配以"tcp"開(kāi)頭的行,不區(qū)分大小寫(xiě)
!d; #不刪除蕊梧,即是刪除其它行
/.*[-]$/d; #以"-"結(jié)束的行刪除
p;
}" \
test.txt
sed -n "/./{
/^tcp/I!d; #以"tcp"開(kāi)頭的行不刪除
/.*[-]$/d; #以"-"結(jié)束的行刪除
p;
}" \
test.txt
sed -e "aaa" -e "bbb"
sed -n -e '/id="23"/{s/isopen="1"/isopen="0"/p;}' -e '/id="24"/{s/isopen="1"/isopen="0"/p;};' datafile
等價(jià)于
sed -n '
/id="23"/{s/isopen="1"/isopen="0"/p;};
/id="24"/{s/isopen="1"/isopen="0"/p;};
' datafile
sed中使用shell命令
sed "s/^/$(echo $R%ANDOM).rmvb_/g"
sed "s/^/$(date +"%Y%m%d").rmvb_/g"
添加行
CONTENT="111
222
333
444
555"
echo "${CONTENT}" | sed -e "/222/{ \
a\aaa\r\nbbb
q;
}"
sed -i '/原行內(nèi)容/a要添加的新一行內(nèi)容' 文件
sed -i '25a/usr/local/php.ini' aaa.txt #要在第25行插入一行新的內(nèi)容 /usr/local/php.ini
sed -i '/I love apple/aDo you love it' aaa.txt #在特定內(nèi)容后插入一行
刪除包含"My"的行到包含"You"的行之間的行(包括My行和You行)
sed '/My/,/You/d' datafile
行首的某些特殊字符有時(shí)候需要添加轉(zhuǎn)義符霞赫,比如#和$
用#做分隔符,#為第一個(gè)字符時(shí)要轉(zhuǎn)義
sed 's#/home/test/task/#abc/#g'
sed '\#/home/test/bin/aa.sh#d'
utf-8
在utf-8編碼的文件中添加utf-8編碼的文本肥矢,
因首行有格式數(shù)據(jù)端衰,不能直接寫(xiě)在執(zhí)行的腳本文件里,要存到單獨(dú)的文件里甘改,并且舍棄第一行旅东,例:
sed -n "1,/abc/p" input_file >> tmp_file #第一部分
sed -n "1!p" append_txt >> tmp_file #要添加的數(shù)據(jù)
sed -n "1,/abc/!p" >> tmp_file #剩下的部分
mv tmp_file input_file #重命名
同理,如果是匹配字符串也是utf-8編碼十艾,也要先用這種方式事抵代,先將pattern字符串以及目標(biāo)字符串都以u(píng)tf-8編碼方式保存到單獨(dú)的文件中,
再(通過(guò)sed)讀取到變量中處理忘嫉,讀取的時(shí)候可以指定行荤牍,如:
PATTERN="$(sed "3p")"
也可用一定格式來(lái)描述案腺,如:":pattern=不知道:dest=沒(méi)關(guān)系:",然后在行循環(huán)中通過(guò)如下的方式獲得相關(guān)數(shù)據(jù):
PATTERN=$(sed -n "s/:pattern=\([^:]*\):.*/\1/Ip")
DEST=$(sed -n "s/:dest=\([^:]*\):.*/\1/Ip")
同時(shí)sed的輸出文件需要事先以u(píng)tf-8編碼的方式創(chuàng)建好康吵,并且不能用覆蓋方式劈榨,同時(shí)sed的輸出文件需要事先以u(píng)tf8編碼的方式創(chuàng)建好,并且不能用覆蓋方式
或者用sed二進(jìn)制的方式強(qiáng)制確定文件頭晦嵌,如:
echo -e -n "\xEF\xBB\xBF" > output_file.txt
LINE_NUM=0
while read LINE
do
LINE_NUM=$(expr ${LINE_NUM} + 1)
PATTERN=$(echo "${LINE}" | sed -n "s/.*:pattern=\([^:]*\):.*/\1/Ip")
DEST=$(echo "${LINE}" | sed -n "s/.*:dest=\([^:]*\):.*/\1/Ip")
if test -z "${PATTERN}" -o -z "${DEST}"; then
echo "line_num=${LINE_NUM} invalid format : ${LINE}"
continue
fi
sed -n "s/${PATTERN}/${DEST}/p" data_file.txt >> output_file.txt
done<<EOF
$(cat pattern_file.txt)
EOF
直接處理二進(jìn)制/十六進(jìn)制
s 's/\x11\x22/\xAA\xBB/g' binfile > new_binfile
#\x5B是'['同辣,前面要加轉(zhuǎn)義符,下面兩項(xiàng)等價(jià)
sed "s/\x0A\\\x5b\x41/abc/g" a.txt
sed "s/\x0A\[\x41/abc/g" a.txt
直接對(duì)指定行做處理
sed "1s/\x11\x11\x11/\xEF\xBB\xBF" a.txt #第一行
sed "1i\\\xEF\xBB\xBF" a.txt
sed "1a\\\x11\x22\x33" a.txt
sed "\$a\\\x11\x22\x33" a.txt #最后一行
sed '$a\\\x11\x22\x33' a.txt
sed "10r /root/test.txt" a.txt > b.txt #在第10行插入文件
行范圍
sed -n '5,10{/pattern/p}' file
sed -n '1,/^tagname$/!p' file
sed -n "/aaa/,/bbb/{=;p;}" file #全局每一個(gè)aaa和bbb行之間的行都會(huì)被輸出
sed -n "/ccc/,\$wccc.out" file ccc到最后一行
只匹配一次
echo "aasdfasdfasdf" | sed -n "/^Revision: /{s/^Revision: \(.*\)$/\1/p;q;}"
分離文件內(nèi)容耍铜,將 ###aaa_start 行到 ###aaa_end 行的內(nèi)容輸出到 aaa.txt 文件邑闺,###bbb_start 行到 ###bbb_end 行的內(nèi)容輸出到 bbb.txt 文件,
兩文件內(nèi)容允許交叉重疊棕兼,也就是說(shuō)每一行都會(huì)交給兩個(gè)表達(dá)式處理
sed -n -e "/###aaa_start/,/###aaa_end/waaa.out" -e "/###bbb_start/,/###bbb_end/wbbb.out" data.txt
aaa.out文件和bbb.out文件的內(nèi)容不能重疊陡舅,否則無(wú)法正確的匹配到bbb.out的開(kāi)始行
sed -n "
/###aaa_start/{
:tag_a_loop;
waaa.out
n;
/###aaa_end/{
waaa.out
btag_a_end;
}
btag_a_loop;
:tag_a_end;
};
/###bbb_start/{
:tag_b_loop;
wbbb.out
n;
/###bbb_end/{
wbbb.out
btag_b_end;
}
btag_b_loop;
:tag_b_end;
};" data.txt
不包含首尾標(biāo)題行
sed -n "
/###aaa_start/{
:tag_a_loop;
n;
/###aaa_end/!{
waaa.out
btag_a_loop;
}
};
/###bbb_start/{
:tag_b_loop;
n;
/###bbb_end/!{
wbbb.out
btag_b_loop;
}
};
" data.txt
某一行到文件末尾都保存成一個(gè)文件
sed -n -e "/###aaa_start/,/###aaa_end/waaa.out" -e "/###bbb_start/,/###bbb_end/wbbb.out" -e "/###ccc_start/,\$wccc.out" data.txt
不保存收尾標(biāo)記的行
sed -n "
/###aaa_start/{
:tag_a_loop;
n;
/###aaa_end/!{
waaa.out
btag_a_loop;
}
};" data.txt
在原來(lái)行之前插入行號(hào),或者用grep -n
sed = test.txt | sed 'N;s/\n/\t/'
插入空行
在匹配式樣“regex”的行之前插入一空行
sed '/regex/{x;p;x;}'
在匹配式樣“regex”的行之后插入一空行
sed '/regex/G'
在匹配式樣“regex”的行之前和之后各插入一空行
sed '/regex/{x;p;x;G;}'