对于sed 命令,大家熟知的都是使用s
来修改内容。但是除了s
, sed还提供了其他的方式来修改内容:
a
追加内容
i
插入内容
d
删除内容
c
替换内容
l
显示内容
p
打印内容
我们一起来看一下(作者使用的是mac 自带的FreeBSD sed, 所以以下语法以FreeBSD为准),其实用法大致相同。
追加内容(a,i):
seq 3 | sed 'a\
hello'
1
hello2
hello3
hello⏎
每一行后面都加了\nhello
。 a
前面也可指定行数,比如2a
表示在第二行后面追加。$
则表示最后一行。
seq 3 | sed '$a\
hello'
1
2
3
hello⏎
i
和a
的区别在于添加内容的位置,i
添加在行的前面, a
添加在行的后面。
c,d,l,p:
c
,d
,l
,p
表示整行内容被修改(Change), 删除(Delete), 列出(List) 和打印(Print). 前面可以加行号,不加行号则表示应用在每一行。
seq 3 | sed '$c\
hello'
1
2
hello⏎
也可以用m,n
表示一个区间,例1,3c
表示替换从第一行到第三行,也就说说包括第一行,第二行和第三行的所有内容整体被修改为指定的一个值。这里与顺序有关,这里如果m < n
则表示从m
行到n
行, 如果m >= n
,则只表示第m
行。
seq 5 | sed '2,4c\
hello'
1
hello5
2,4
表示第2行到第4行整体被替换为hello
.
seq 5 | sed '4,2d'
1
2
3
5
4,2
表示只有第4行被删除。
因为d
,l
,p
无需新增内容,所以后面不需要任何参数。 d
也可以使用D
.
l
,p
的区别在于l
会对输出行加上$
, p
则不会。 命令行中一般与 -n
搭配使用。
seq 5 | sed -n '1,2l'
1$
2$
seq 5 | sed -n '1,2p'
1
2
再看s的其他用法:
- 使用一个字符串表示包含该字符串的行
cat input.txt
# world world
# hello world
cat input.txt | sed '/hello/s/world/T/'
# world world
# hello T
只有有hello
的一行中的world 被修改为T
。
- 也可以使用
n;
匹配间隔几行:
seq 10 | sed 'n;n;n;s/./test/'
# 1
# 2
# 3
# test
# 5
# 6
# 7
# test
# 9
# 10
三个n;
表示间隔3行。
- 当选择的部分或者替换的部分出现特殊字符与命令中的字符冲突时,可以修改命令中的字符为其他不冲突的命令使用。 以下命令效果一样。
echo "/home/example"| sed 's#/home/example#/usr/local/example#'
# /usr/local/example
echo "/home/example"| sed 's!/home/example!/usr/local/example!'
# /usr/local/example
网友评论