sed note

sed的if-else条件处理

sed -n '/bsp/!p' file
sed -n '/bsp/!d' file

!号不是修饰p而是修饰前面的匹配模式的xxx,可以这么理解吗?, 忽略大小写的I选项也同理

cat work.txt |\
sed -n '/tag_a/,/tag_b/{
p;
/tag_b/a
}' #打印tag_a到tag_b之间的内容,并在tag_b之后加入一个空行,支持有多个这种段落
cat work.txt |\
sed -n '/tag_a/,/tag_b/!{
p;

}' -e '/tag_b/a'#打印除了tag_a到tag_b之间的内容,即提出tag_a到tag_b直接的内容,支持有多个这种段落

t是条件跳转,如果匹配成功则跳转到a,if(true)-else,T则是匹配失败则跳转,if(false)-else

sed "/ccc/s/$/\tYES/;ta;s/$/\tNO/;:a" test.txt

如果table在前面,可以实现循环

b是无条件跳转到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/;     #实现行尾追加,同理实现行首添加???
        a\new line
        p;
    };
    bend;               #强制跳转,相当于此句和目标tag之间的命令没有
    s/$/\tNO/p;
    :end" \
    test.txt



sed "/abc/ \
    {
        s/$/\ttrue/;
        b end;
    }
    s/$/\tfalse/;
    :end
    " ${file}
#匹配成功的行后添加\ttrue,匹配失败的行后添加\tfalse,即:首行的模式匹配后的{}是整体执行的。



sed "/abc/ \
    s/$/\ttrue/;
    b end;
    s/$/\tfalse/;
    :end
    " ${file}
#只会在匹配成功的行后面添加\ttrue,匹配失败的行没有行为,即:b end这一句是独立的,每次都执行。

满足条件后,多操作同时处理

sed -n "/^tcp/I{        #匹配以"tcp"开头的行,不区分大小写
        !d;             #不删除,即是删除其它行
        /.*[-]$/d;      #以"-"结束的行删除
        p;
    }" \
    test.txt
    
sed -n "/./{
        /^tcp/I!d;      #以"tcp"开头的行不删除
        /.*[-]$/d;      #以"-"结束的行删除
        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

等价于

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 '/原行内容/a要添加的新一行内容' 文件
sed -i '25a/usr/local/php.ini' aaa.txt          #要在第25行插入一行新的内容 /usr/local/php.ini
sed -i '/I love apple/aDo you love it' aaa.txt  #在特定内容后插入一行

删除包含"My"的行到包含"You"的行之间的行(包括My行和You行)

sed '/My/,/You/d' datafile

行首的某些特殊字符有时候需要添加转义符,比如#和$

用#做分隔符,#为第一个字符时要转义

sed 's#/home/test/task/#abc/#g'
sed '\#/home/test/bin/aa.sh#d'

utf-8

在utf-8编码的文件中添加utf-8编码的文本,

因首行有格式数据,不能直接写在执行的脚本文件里,要存到单独的文件里,并且舍弃第一行,例:

sed -n "1,/abc/p" input_file >> tmp_file    #第一部分
sed -n "1!p" append_txt >> tmp_file         #要添加的数据
sed -n "1,/abc/!p" >> tmp_file              #剩下的部分
mv tmp_file input_file                      #重命名

同理,如果是匹配字符串也是utf-8编码,也要先用这种方式事,先将pattern字符串以及目标字符串都以utf-8编码方式保存到单独的文件中,

再(通过sed)读取到变量中处理,读取的时候可以指定行,如:

PATTERN="$(sed "3p")"

也可用一定格式来描述,如:":pattern=不知道:dest=没关系:",然后在行循环中通过如下的方式获得相关数据:

PATTERN=$(sed -n "s/:pattern=\([^:]*\):.*/\1/Ip")
DEST=$(sed -n "s/:dest=\([^:]*\):.*/\1/Ip")

同时sed的输出文件需要事先以utf-8编码的方式创建好,并且不能用覆盖方式,同时sed的输出文件需要事先以utf8编码的方式创建好,并且不能用覆盖方式

或者用sed二进制的方式强制确定文件头,如:

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

直接处理二进制/十六进制

s 's/\x11\x22/\xAA\xBB/g' binfile > new_binfile
#\x5B是'[',前面要加转义符,下面两项等价
sed "s/\x0A\\\x5b\x41/abc/g" a.txt
sed "s/\x0A\[\x41/abc/g" a.txt

直接对指定行做处理

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     #全局每一个aaa和bbb行之间的行都会被输出
sed -n "/ccc/,\$wccc.out" file  ccc到最后一行

只匹配一次

echo  "aasdfasdfasdf" | sed -n "/^Revision: /{s/^Revision: \(.*\)$/\1/p;q;}"

分离文件内容,将 ###aaa_start 行到 ###aaa_end 行的内容输出到 aaa.txt 文件,###bbb_start 行到 ###bbb_end 行的内容输出到 bbb.txt 文件,

两文件内容允许交叉重叠,也就是说每一行都会交给两个表达式处理

sed -n -e "/###aaa_start/,/###aaa_end/waaa.out" -e "/###bbb_start/,/###bbb_end/wbbb.out" data.txt

aaa.out文件和bbb.out文件的内容不能重叠,否则无法正确的匹配到bbb.out的开始行

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

不包含首尾标题行

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

某一行到文件末尾都保存成一个文件

sed -n -e "/###aaa_start/,/###aaa_end/waaa.out" -e "/###bbb_start/,/###bbb_end/wbbb.out" -e "/###ccc_start/,\$wccc.out" data.txt

不保存收尾标记的行

sed -n "
/###aaa_start/{
    :tag_a_loop;
    n;
    /###aaa_end/!{
        waaa.out
        btag_a_loop;
    }
};" data.txt

在原来行之前插入行号,或者用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;}'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容

  • // 在每一行后面增加一空行 sed G // 将原来的所有空行删除并在每一行后面增加一空行。 // 这样在输出的...
    梵雲魔羅阅读 495评论 0 0
  • Sed工具工作原理及特性 1. sed是流编辑器,每一次读取一行到内存中,即称之为模式空间(pattern spa...
    魏镇坪阅读 10,967评论 0 12
  • awk 基础概念Awk把文件(或其他方式的输入流, 如重定向输入)看作一个记录集, 把每一行看作一条记录, 把每一...
    yichen_china阅读 482评论 0 1
  • 行前或行后插入 sed 'p;s/^.*$/--------/' file awk '{print $0;prin...
    不排版阅读 520评论 0 0
  • sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的...
    ChinaLeee阅读 347评论 0 0