sed命令
sed命令语法
sed命令语法如下:
sed 选项 '命令部分' 文件
常见的选项如下:
-
-n : 只打印被sed处理的行,默认是处理后的结果,经常与p搭配。
-
-i : 默认情况下,会将待处理的文件内容拷贝到缓存中,处理之后输出到屏幕上,此时无论是删除,还是查找替换,都对源文件的内容没有任何影响。-i 选项直接修改原文件,而不在屏幕上输出。这种无损操作可以提前测试查找替换的结果,避免产生不可逆的修改。
sed最重要的是命令部分,命令部分又分为三个小部分:找到匹配的行、具体操作、可选的新增内容
找到匹配的行
要确定哪些行被找到,有两种方式:
-
直接指定行,使用n1,n2表示第n1行到第n2行,不指定就是所有行被找到。
-
基于内容的查找,使用 /text/ 去查找text文本,支持正则表达式。通过这两种方式找到的行,进入下一步等待操作。
上一部通过直接指定或查找的方式找到了待操作的行,这一步就要指定基于行的具体的操作,具体操作分为两大类:基于整行的操作、基于字符的操作。
基于整行的操作又分为打印、删除、追加、替换、插入。
基于整行的打印
打印操作符是p,为了只打印需要的行,需要加上-n选项,否则会重复输出需要的行。
例如,打印前5行:
sed -n 1,5p file.txt
打印所有行:
sed -n p file # 打印所有行
打印包含“word”文本的行:
sed -n /word/p
打印前5行中包含“word”文本的行:
sed -n 1,5/word/p file.txt
基于整行的删除
删除的操作符是d,在匹配到行之后,使用如下操作删除:
sed 1,3d file.txt
这行命令删除了前3行。
或者使用:
sed /text/d file.txt
这行命令将包含有“text”文本的行删除。
基于整行的追加、插入和替换
基于整行的追加、插入、替换的指令分别是a、i、c。例如:
要在第一行前面加入新文本内容,运行:
sed "1i new text" file.txt
要在最后一行后面追加新内容,运行:
sed "$a new text" file.txt
这里$表示最后一行。
而要将第3行整行换成新内容,运行:
sed "3c new text " file.txt
注意,由于后面的文本中出现了空格,故而上面这三个操作都是需要添加引号的,否则会被识别为命令行参数。
前面提到的替换操作是整行替换,sed还可以基于字符替换。
基于字符的查找替换
基于字符的查找替换是sed最常见的操作。在找到行之后,使用s/旧文本/新文本/g
以执行基于字符的替换操作。这里的g
表示行内全局替换,否则只替换找到的每行的第一个。例如:
sed s/old/new/g file.txt
上面这行命令将所有old文本替换成new文本。
sed 1,5s/old/new/gi file.txt
上面这行命令将前5行的old文本替换成new文本,且忽略大小写。
值得提醒的的是,一般情况下使用 s/旧文本/新文本/g
进行替换,但这里的/
可以换成其它字符,如果遇到文本中本来就包含/
的情况,可以使用转义符号\
转义,不过更加建议更换成其它字符,比如*
。
例如,更换apt包管理器的软件仓库地址,以提升下载速度,而仓库地址包含/
字符,此时,就可以使用:
sed -i s*http://archive.ubuntu.com/ubuntu/*https://mirrors.aliyun.com/ubuntu/*g /etc/apt/sources.list
这里我们使用了*
进行分隔。注意加-i
将修改应用到源文件。
sed配合管道、重定向
sed可以配合管道使用:
nl file.txt | sed -n 1,5p
上面这行命令先显示文件的行号,然后打印前5行。
重定向的意思是把本来要输出到屏幕上的内容复制到新文件中,例如:
sed -n 1,5p file.txt > new.txt
上面这行命令将文件的前5行复制到new.txt中。
再比如:
sed -n /文本/p 文件 > new.txt
这行命令将文件中包含word文本的那些行复制到new.txt中。