linux三剑客中的sed常用命令

sed和grep类似,也是一种文件编辑器,相比grep仅限于搜索匹配,sed也支持编辑
sed是一个流编辑器,所谓流编辑器是指sed每次只从文件或stdin中读入一行,将读入的行保存至模式空间然后根据指定的要求对其进行处理,并将处理后的结果输出至屏幕,接着读入下一行,整个文本的过程如流水线般被逐行处理后输出。
sed主要用来自动编辑一个或多个文件,可以将数据进行增删改查等特定工作,简化对文件的反复操作

 1,sed命令的语法格式:

sed的命令格式: sed [option] 'sed command' filename

sed的脚本格式:sed [option] -f  'sed script' filename

【option】

  • -n :只打印模式匹配的行
  • -e :直接在命令行模式上进行sed动作编辑,此为默认选项
  • -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
  • -r :支持扩展表达式
  • -i :直接修改文件内容

【sed command中的命令选项】

  • a : 在当前行下面插入文本;
  • i  :  在当前行上面插入文本;
  • c : 把当前行改为新的文本;
  • d :  删除,将选择的内容删除
  • D : 删除模板第一行
  • s :  替换指定字符 (最常用)
  • p :  打印模板块的行。(常常和 -n配合使用)
  • P : 打印模板块的第一行;

【sed command中的高级命令】

  • g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
  • G:[address[,address]]G 将hold space中的内容append到pattern space\n后
  • h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
  • H:[address[,address]]H 将pattern space中的内容append到hold space\n后
  • d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern中
  • D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行
  • x:[address[,address]]x 将当前保持空间和模式空间内容互换

备注:

使用G、g和H、h的区别在于 前者是在于将hold space 内容append或者copy覆盖到pattern space,后者是将pattern space 内容append或者copy覆盖到hold space

使用G、H和g、h的区别在于前者是将内容append到另一个地方,后者是将内容copy覆盖到另一个地方

sed读取数据的流程如下流程图所示

 

 

 

【sed command 中的地址范围】

sed 在执行command命令时支持指定范围,常见的范围语法如下

  • first~step: 从first行开始每隔step行开始匹配,例如 sed -n '1~2p' 将会打印所有奇数行,sed -n '2~5p' 从第2行开始,每隔5行打印一行
  • $: 在地址范围参数时指匹配最后一行,注意:在s command 中匹配字符时表示每行行尾
  • /regexp/: 按照正则表达式 匹配行
  • addr1,+N:  匹配addr1和它后边的N行
  • addr1,~N:  匹配addr1和它后边的行,直到输入的下一行的行号是N的倍数

在地址的后边增加一个 ! 符号可以对地址反向选择,也就是说如果在地址的后边加上一个!字符,那么只有不匹配这个地址的行被选择。这个字符对单地址也适用,但对空地址可能异常。

【sed command 中的标记选项】

  • g 表示行内全部替换,ng表示第n个匹配的开始进行替换
  • w 表示把行写入一个文件
  • \1 字串匹配标记(划重点)
  • & 已匹配字符串标记

2,样例 

后续我们以test文件为样例

]# cat -n test

     1    aaa
     2    bbb
     3    ccc
     4    ddd
     5    eee

 2.1 追加内容

sed '1a abc' test    在第1行后面追加新行'abc'
sed '1a\ abc' test   在第1行后面追加新行' abc'
sed '1,4a abc' test  在第1到第4行之间的每行追加新行 'abc'
sed '2,+3a abc' test 从第2行开始到它后面的3行(第5行,总共4行)的每行后面加新行'abc'
sed '2,~4a abc' test
从第2行开始到它后面的第4行(第1个4的倍数行结束)的每行后面加新行'abc'

2.2 替换内容

sed '1,4cabc' test               用'abc'替换掉第1到第4行
sed '/bbb/,/eee/cabc' test       从包含/bbb到包含/eee之间的行用abc 替换
sed '/bbb/,/eee/!cabc' test      /bbb 到/eee范围之外的行用abc替换
sed 's/bb/abc/g' test            将匹配到的bb 用abc替换掉
echo "abc"|sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXZ/' 将abc 替换成对应的大写 y/SET1/SET2 命令模式,其中SET1和SET2 的字符长度要相等
echo "column1 column2 column3 column4" | sed 's/column2.*3/+&+/g' 在column2和column3的前后分别加上 “+”
echo "column1 column2 column3 column4" | sed 's/ /;/3' 将第三个空格替换成 ";"

2.3 增加内容

sed '1,$i abc' test    从文件的第1行到最后一行的每行之前增加新行 'abc'

2.4 行列转换

sed ':a;N;s/\n/,/g;ta' test                    将test 中所有的行数据,拼接出一行输出(逗号分隔)行转列
sed ':a;N;s/\n/,/g;ta' test|sed 's/,/\n/g' 将test 中所有的行数据,拼接出一行数据(逗号分隔),再列转行

2.5 倒序输出

sed '1!G;h;$!d' test                           
将test 中的内容倒序输出,1!G --只有第一行不执行G命令,将hold space中的内容append回到pattern space,h --第一行都执行h命令,将pattern space中的内容拷贝到hold space中,$!d --除了最后一行不执行d命令,其它行都执行d命令,删除当前行
具体流程图如下

2.6 指定格式输出

cat -n test| sed -r '/ddd/,/ggg/{s/([0-9])\t([a-z]+)/\2\t\1/g}'   将 包含ddd,ggg 的行之间的内容与序号进行位置交换

 

posted @ 2021-11-02 22:20  .狂飙的蜗牛  阅读(284)  评论(0编辑  收藏  举报