LINUX 文本处理命令 sed

sed

    sed为行编辑器,默认不编辑原文件,仅对模式空间中的数据做处理。

sed 'AddressCommand' file...   # 对file文件中符合地址的哪些行(Address)进行命令操作(Command)

AddressCommand之间没有空格

Address:

1. StartLine,EndLine

    比如: 1,100           处理1到100行

2.  /RegExp/  正则表达式

    比如: /^root/  开头为root的行

3.  /pattern1/,/pattern2/

    比如:第一次符合pattern1的行开始,至第二次符合pattern2的行,之间的行

4. StartLine,+N

    从StarLine行开始的N行,共N+1行

5.  $

    最后一行

命令  Commond

    d    删除

    p    打印

    a \string    在指定的行后面追加新行(string)

    i  \string    在指定的行前面添加新行(string)

    r FILE        读取FILE文件的内容再来添加到符合Address的行后面。

    w FILE        将file中符合Address的行另存到FILE文件中。

    s /pattern/string/     将file中符合pattern的字符串替换为string ,默认为每行中第一次被pattern匹配到的字符串。

修饰符

    修饰符必须在命令的后面,比如: s /pattern/string/修饰符

    g   全局    s /pattern/string/g  全局替换

    i    忽略大小写      s /pattern/string/i   匹配时忽略大小写


例子:

sed  -n ‘20 ,30p’123.txt      打印123.txt中的第20到30行,带 –n 是静默输出,也就是只输出处理后的结果,不将整个模式空间的内容都输出。

sed  -n ‘20 ,+10p’123.txt      打印123.txt中的第20到30行

sed  -n ‘20 ,$p’123.txt      打印123.txt中的第20到最后一行

sed  -n ‘2~2p’123.txt      打印123.txt中的第2,4,6…偶数行

sed  -n ‘1~2p’123.txt      打印123.txt中的第1,3,5…奇数行

sed  -n ‘p’123.txt     将123.txt中的内容重复输出。sed查找输出一次,p输出一次。

sed  -n ‘/xxw/p’123.txt  将匹配xxw的行都输出,注:xxw不带引号。在sed中,使用正则表达式,用//将正则表达式包围起来。

sed  -n ‘/xxw/,/ting/p’123.txt   对123.txt中匹配xxw的行和匹配ting的行之间的行进行打印操作

sed  -n ‘10,/xxw/p’123.txt           对123.txt中第10行到匹配xxw的行之间进行p操作

sed  ‘2c  xiaodd’123.txt          对123.txt中第2行替换成xiaodd,并显示。

sed   '3s#xxw#ting#g'  123.txt          对123.txt中的第3行进行xxw匹配并替换成ting

echo  xiao xian wen xxw is a man | sed 's#^.*en\([a-z].*\) is .*$#\1#g'    取出其中的xxw(分组替换)。

sed  -r  's#(.*)#&xxw#g'   123.txt  将123.txt中每行后面加上xxw,-r代表使用正则扩展表达式,$代表前面匹配的所有内容,并非是括号中的内容,如果需要,后面接\1  \2 等。

ls  *.txt  | sed  -r  's#(.*).txt#mv & \1.sh#e '   列出本目录下所有txt文件并传递给sed,sed匹配并替换出”mv  1.txt 1.sh ”  e的作用就是用来传递给bash执行。(修改目录下所有.txt文件改为.sh文件,还有一种方法是用renname 例如: rename  .txt  .sh *.txt

注:在sed中 用 –r 后,后面的匹配括号不用接转义\  .

sed  -n   '2p;4p;5p'  123.txt      显示123.txt中的第2,4,5行

sed  -n ‘20  d’123.txt           删除123.txt中的第20行

sed  -n ‘20 ,30d’123.txt          删除123.txt中的第20到30行

sed  -n ‘/xxw/d’123.txt                   删除123.txt中匹配xxw的行

sed  ‘/xxw/a\is’123.txt                   在123.txt中匹配xxw的行后面增加1行is,然后输出。注:这里并没有改变123.txt的内容,只是输出改变而已。不带–n ,因为带了会只输出增加的一行。

sed  ‘/xxw/i\is’123.txt                    在123.txt中匹配xxw的行前面增加1行is,然后输出。

sed  ‘s/xxw/ting/’123.txt                 在123.txt中匹配xxw并将找到的第一个替换成ting。

sed  ‘s/xxw/ting/g’123.txt                     在123.txt中匹配xxw并将找到的全部替换成ting。

sed  -i  's/25/xxw/'  123.txt   将123.txt中的匹配到的字符串25替换成xxw并保存到原文件。等同于: echo  $(sed  's/25/xxw/'  123.txt)  > 123.txt

sed  ‘s/xxw/ting/i’123.txt       在123.txt中匹配xxw并将找到的第一个替换成ting,忽略大小写

sed  ‘s/xxw/ting/ig’123.txt      在123.txt中匹配xxw并将找到的全部替换成ting。忽略大小写

sed  -n  '/^\//p'   123.txt        在123.txt中匹配以/开头的行


注:    sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。所以在脚本中想用[ $? -eq 0 ]来确认前面的sed语句是否执行错误是不可能的。



猜你喜欢

转载自blog.csdn.net/freshair_x/article/details/79986532