【替换】s
1
|
sed
'/mislost/long/g'
filename
|
在sed中,文件的每一行都会作为输入传入到sed中,如果不加g那么上述列子中只会替换每一行
第一个匹配到的mislost。加g则会匹配一行中所有的mislost。
想要定位一个行,然后去匹配需要这样做
1
|
sed
'/test/s/mislost/long/g'
filename
|
如果这一行包含有test,则将mislost替换为long
在例子中,/test/ 就是一个地址,sed在做操作的时候可以指定0个,1个或者2个地址。每个地
1
|
sed
'/test/s/mislost/long/g'
filename
|
址都是一个描述模式。
·如果没有指定地址,那么命令将应用于每一行。
·如果只有一个地址,那么命令应用于这个地址匹配的任意行。
·如果指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址的第一行和它后面的行,直到匹配到第二个地址的行(包括此行)
·如果地址后面根由感叹号(!),那么命令就应用于不匹配该地址的所有行。
来看一个有趣的例子:
1
|
sed
s
'/^$/.Mis'
|
它用.Mis来取代每一个空行。在替换命令的部分(.Mis)不必转义字面的句点,所以我可以直接用.而不需要用\.来转义它。
一个在替换中列出不想被替换的对象
1
|
sed
'/---/!s/--/lost/'
|
上面的例子只会将--替换为lost 而不会将---替换为lost-
【删除】d
1
2
|
sed
'd'
它将删除所有的行
sed
'1d'
它将只删除第一行
|
有一个相当重要的概念:
1
|
sed
'1d'
file1 file2 它将只删除file1的第一行,不会删除file2的第一行
|
·在sed中,行号指由sed维护的内部行数。该计数器不会因为有多个输入文件而重置。因此,不管指定了多少个输入文件,在输入流中也只有一行1。同样,输入流也只有一个最后的行,可以用$来表示最后一行。
重要:正则表达式必须封闭在斜杠中
1
2
3
|
/^$/d 只删除空行
^$d 这样的使用方法则是错误的
$!d 这样表示除了最后一行,都删除掉
|
如果提供两个地址,那么久指定了命令执行的行范围。比如:
1
|
/^mislost/,/^long
/d
删除以mislost开头的到以long开头的左右行
|
有一个很有用的混合使用行地址和模式地址的列子:
1
|
1
,/^$/d
|
删除了从第一行一直到第一个空行的所有行,可以用来删除某些文件的头文件。
清注意,如果文件中没有空行,将删除所有的行!
正常的删除,sed会将匹配到的行整个删除,如果我们想要只删除行中匹配的部分,可以用替换命令并指定一个空得替换,比如:
aabbccdd 想要删除bb 最后的结果为 aaccdd
1
|
sed
's/bb//'
|
【提取内容】
来看两个简单的提取例子:
1
2
|
sed
-n
'/^root/,'
/^mislost
/p
'
sed
-n
'/^root/p;/^mislost/p'
|
第一个是提取“以root开头的行到以mislost开头的行之间的所有内容”。
第二个是提取“以root开头的行和以mislost开头的行”
【插入、追加和更改】a i c
1
|
sed
'/^a/i\mislost'
插入 在以a开头的行上插入一行mislost
|
1
|
sed
'/^a/a\mislost'
追加 在以a开头的行下追加一行mislost
|
1
|
sed
'/^a/c\mislost'
更改 把以a开头的行修改为mislost
|
在以a开头的行下追加mislost
注意:追加和插入只应用于单个行地址,而不是一个范围内的行。更改命令可以处理一个范围内的行。
这里的更改命令要区别于替换,替换只是将匹配的关键字替换了而不是整个行,c\则修改了整个行的内容。
【列表】l
列表命令(l) 用于显示模式空间的内容,将非打印的字符显示为两个数字的ASCII码。
cat test.txt
1
2
3
|
aaaa www.baidu.com
bbbb www.sina.com.cn
cccc www.qq.com
|
sed -n -e "l" test.txt
1
2
3
|
aaaa\twww.baidu.com$
bbbb\twww.sina.com.cn$
cccc\twww.qq.com$
|
【转换】y
1
|
sed
'y/abc/xyz'
|
y命令开启转换,转换对应为:
a=>x
b=>y
c=>z
PS:转换命令的一个可能的用处是用大写字母替换对应的小写字母
【打印】p
【退出】q
退出命令会使sed停止读取新的输入行(并停止将它们发送到输出)。
1
|
sed
'/50q/'
|
打印每一行,直到第50行,并且退出,类似于Unix中的head命令。
同样,这个命令也可以用地址范围来实现
1
|
sed
-n
'1,50p'
|
【高级命令】
h或者H 将模式空间的内容复制或者追加到保持空间
g或者G 将保持空间的内容复制或者追加到模式空间
x 交换保持空间和模式空间的内容
【标签】
表示前是任意不多余7个字符的序列。标签占据一行并以冒号开始。
一个有趣的例子
1
|
sed
':a;N;s/\n//;$!ba'
|
解析:
:a定义一个标签a
N将下一行的内容添加到当前读入行,并在末尾加一个\n
s/\n//将新行中的\n删掉
$!ba如果读入行不是最后一行就跳转到标签a出继续执行后面的执行
这个命令的作用在于将一个文件中的所有行并列为一行内容。