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