sed note

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;}'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伴挚,一起剝皮案震驚了整個(gè)濱河市靶衍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茎芋,老刑警劉巖颅眶,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異田弥,居然都是意外死亡涛酗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)偷厦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)商叹,“玉大人,你說(shuō)我怎么就攤上這事只泼∑鼠希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵请唱,是天一觀的道長(zhǎng)弥咪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)十绑,這世上最難降的妖魔是什么聚至? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮本橙,結(jié)果婚禮上扳躬,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好坦报,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布库说。 她就那樣靜靜地躺著,像睡著了一般片择。 火紅的嫁衣襯著肌膚如雪潜的。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天字管,我揣著相機(jī)與錄音啰挪,去河邊找鬼。 笑死嘲叔,一個(gè)胖子當(dāng)著我的面吹牛亡呵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硫戈,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锰什,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了丁逝?” 一聲冷哼從身側(cè)響起汁胆,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霜幼,沒(méi)想到半個(gè)月后嫩码,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罪既,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年铸题,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琢感。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丢间,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猩谊,到底是詐尸還是另有隱情千劈,我是刑警寧澤祭刚,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布牌捷,位于F島的核電站,受9級(jí)特大地震影響涡驮,放射性物質(zhì)發(fā)生泄漏暗甥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一捉捅、第九天 我趴在偏房一處隱蔽的房頂上張望撤防。 院中可真熱鬧,春花似錦棒口、人聲如沸寄月。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)漾肮。三九已至厂抖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間克懊,已是汗流浹背忱辅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谭溉,地道東北人墙懂。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像扮念,于是被迫代替她去往敵國(guó)和親损搬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • // 在每一行后面增加一空行 sed G // 將原來(lái)的所有空行刪除并在每一行后面增加一空行柜与。 // 這樣在輸出的...
    梵雲(yún)魔羅閱讀 488評(píng)論 0 0
  • Sed工具工作原理及特性 1. sed是流編輯器场躯,每一次讀取一行到內(nèi)存中,即稱之為模式空間(pattern spa...
    魏鎮(zhèn)坪閱讀 10,925評(píng)論 0 12
  • awk 基礎(chǔ)概念A(yù)wk把文件(或其他方式的輸入流, 如重定向輸入)看作一個(gè)記錄集, 把每一行看作一條記錄, 把每一...
    yichen_china閱讀 473評(píng)論 0 1
  • 行前或行后插入 sed 'p;s/^.*$/--------/' file awk '{print $0;prin...
    不排版閱讀 512評(píng)論 0 0
  • sed是一種流編輯器旅挤,它是文本處理中非常中的工具踢关,能夠完美的配合正則表達(dá)式使用,功能不同凡響粘茄。處理時(shí)签舞,把當(dāng)前處理的...
    ChinaLeee閱讀 345評(píng)論 0 0