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,n
、m,$
或者正则表达式/[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
说明: -n
和p
是一起使用的
2.7.其他说明
只有-i
的时候才会对文件进行修改,其他情况都是在控制台进行操作的。
3.sed的正则
- $ 表示行尾
- ^ 表示行首
- [a-z0-9]表示字符范围
- [^]表示除了字符集中的字符以外的字符
- sed的正则中 \(\) 和 \{m,n\} 需要转义
- . 表示任意字符
- 表示零个或者多个
- \+ 一次或多次
- \? 零次或一次
- \| 表示或语法