Shell脚本(一)之sed命令

1.语法

sed [选项] [动作]
sed -i "/^*.TEST.*$/cexport TEST=AAA" /home/fracong/tmp/test.sh

选项与参数

  • -n :使用安静(silent)模式,加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
  • -e :直接在命令列模式上进行 sed 的动作编辑;
  • -f : -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的使用方法。

2.function的使用

2.1.删除行d

//test.sh 内容如下
export TEST1=test1
export TEST2=test2
export TEST3=test3
export TEST4=test4
export TEST5=test5

命令:sed '2,3d' test.sh

export TEST1=test1
export TEST4=test4
export TEST5=test5

其中d表示删除行,2,3表示删除行的范围,其中$可以用来表示最后一行。

除了使用m,n来选取行的位置,还可以使用正则表达式来表示

命令:sed '/TEST4/d' test.sh

export TEST1=test1
export TEST2=test2
export TEST3=test3
export TEST5=test5

/TEST4/ 是一个正则表达式,在sed中正则表达式是写在 /.../ 两个斜杠中间的。
/^export TEST5/表示匹配每一行中以export TEST2开头的

2.2.新增行a

export TEST1=test1
export TEST2=test2
export TEST3=test3

命令:sed '1a export TEST=test' test.sh
export TEST1=test1
export TEST=test
export TEST2=test2
export TEST3=test3

1表示第一行(也可以是正则表达式),a表示新增一行,后面的export TEST=test为新增的字符串,会出现当前行的下一行

命令:sed '1i export TEST=test' test.sh
export TEST=test
export TEST1=test1
export TEST2=test2
export TEST3=test3

1表示第一行(也可以是正则表达式),a表示新增一行,后面的export TEST=test为新增的字符串,会出现当前行的上一行
输出:

2.3.替换行c

export TEST1=test1
export TEST2=test2
export TEST3=test3
命令:sed '2c export TEST=test' test.sh
c表示替换行,2为行数(也可以是正则表达式),后面跟字符串,进行替换行操作。
export TEST1=test1
export TEST=test
export TEST3=test3

替换以2开头的行,其内容是c命令后面的字符串

2.4.替换字符串

2.4.1.替换每一行的第一个

export TEST1=test1
export TEST2=test2
export TEST3=test3
export TEST24=TEST24

命令:sed 's/TEST2/TEST/' test.sh

export TEST1=test1
export TEST=test2
export TEST3=test3
export TEST4=TEST24

其中TEST2为选取的字符串(也可以是正则表达式)。

2.4.2.替换全局所有

export TEST1=test1
export TEST2=test2
export TEST3=test3
export TEST24=TEST24

命令:sed 's/TEST2/TEST/g' test.sh

export TEST1=test1
export TEST=test2
export TEST3=test3
export TEST4=TEST4

其中TEST2为选取的字符串(也可以是正则表达式)。

2.4.3.替换某些行的所有

export TEST1=test1
export TEST2=test2
export TEST3=test3
export TEST24=TEST24

命令:sed '2s/TEST2/TEST/g' test.sh

export TEST1=test1
export TEST=test2
export TEST3=test3
export TEST24=TEST24
其中2为某一行,可以使用m,nm,$或者正则表达式/[0-9]/(选取行数的正则),TEST2为选取的字符串(也可以是正则表达式)。

2.5.插入字符串

export aaatTTtt=test

命令:sed -i 's/aaa/&AAA/g' test.sh

export aaatAAATTtt=test

其中aaa为选取的字符串(也可以是正则表达式,如^和$),&为选取字符串的地址,也就是说$AAA代表aaaAAA,其实该命令就是将aaa替换为aaaAAA,也就是在aaa后面添加字符串AAA

同理,在aaa前面添加字符串命令:sed -i 's/aaa/AAA&/g' test.sh

2.6.搜索

export TEST1=test1
export TEST2=test2
export TEST3=test3

命令:sed -n '2p' test.sh

export TEST2=test2

说明-np是一起使用的

2.7.其他说明

只有-i的时候才会对文件进行修改,其他情况都是在控制台进行操作的。

3.sed的正则

  • $ 表示行尾
  • ^ 表示行首
  • [a-z0-9]表示字符范围
  • [^]表示除了字符集中的字符以外的字符
  • sed的正则中 \(\) 和 \{m,n\} 需要转义
  • . 表示任意字符
  • 表示零个或者多个
  • \+ 一次或多次
  • \? 零次或一次
  • \| 表示或语法

猜你喜欢

转载自blog.csdn.net/m0_37356874/article/details/107831478