Linux中使用sed命令替换字符串(一)

  • 2019-09-02
  • 0
  • 0

sed命令的选项:

    sed [选项] [动作]
选项与参数:
-n :使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印
被 sed 特殊处理的行.
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

function:
a :新增行, a 的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)
c :取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
i :插入行, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 一般是替换符合条件的字符串而不是整行

一般function的前面会有一个地址的限制,例如 [地址]function,表示我们的动作要操作的行。下面我们通过具体的例子直观的看看sed的使用方法。

sed元字符集

^           匹配行开始,如:/^sed/匹配所有以sed开头的行。
$           匹配行结束,如:/sed$/匹配所有以sed结尾的行。
.           匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
*           匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[]          匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。  
[^]         匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\)      匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
&           保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\<           匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\>           匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\}      重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\}     重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\}    重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。

文本替换:

sed 's#原字符串#新字符串#g'  file
      s     单独使用→将每一行中第一处匹配的字符串进行替换
      g     每一行进行全部替换→sed指令s的替换标志之一(全局替换)
sed -i 's/原字符串/替换字符串/g' filename      ####替换文件中的所有匹配项
sed 's/^/添加的头部&/g'                        ####在所有行首添加
sed 's/$/&添加的尾部/g'                        ####在所有行末添加
sed '2s/原字符串/替换字符串/g'                 ####替换第2行
sed '$s/原字符串/替换字符串/g'                 ####替换最后一行
sed '2,5s/原字符串/替换字符串/g'               ####替换2到5行
sed '2,$s/原字符串/替换字符串/g'               ####替换2到最后一行
sed 's/^/添加的头部&/g;s/$/&添加的尾部/g'       ####同时执行两个替换规则,中间加分号
[root@ljc ~]# sed -n '/^$/p' liangjc.txt      打印空行
[root@ljc ~]# sed '/^$/d' liangjc.txt         删除空行,未真正删除,与-i参数一起使用才真正删除内容
[root@ljc ~]# sed '13,$d' liangjc.txt         删除第13到末尾的行

sed取区间范围:

[root@ljc ~]# sed -n '1,3p' liangjc.txt                   取1到3行
[root@ljc ~]# sed -n  '/112/p' liangjc.txt                    取匹配112的行
[root@ljc ~]# sed -n '13,$'p liangjc.txt                  取第13行到末行之间的内容

选项 -e:允许在同一行里执行多条命令:

1到2行删除,并全局将1替换为2
[root@ljc ~]# sed -e '1,2d' -e 's/1/2/g' liangjc.txt 

打印奇数行:

[root@ljc ~]# sed -n '1~2p' liangjc.txt 

打印偶数行:

[root@ljc ~]# sed -n '2~2p' liangjc.txt 

追加内容

在以1开头行的后面插入test
[root@ljc ~]# sed '/^1/a\test' liangjc.txt 
root::0:0:root:/root:/bin/bash
bin::1:1:bin:/bin:/sbin/nologin
1
test
2}

i 插入insert,在指定行前添加一行或多行文本

将 hello world 追加到以test开头的行前面:

[root@ljc ~]#  sed '/^this/i\hello world ' file

在t1.txt文件第1行之前插入test:

[root@ljc ~]# sed -i '1i\test' t1.txt

评论

还没有任何评论,你来说两句吧

提供支持 - 友情链接 - 衫小寨