sed 的全称是 stream editor,流编辑器的意思。可以让我们在命令行中快速处理文本内容。
安装
ubuntu 安装 sed
$ sudo apt-get install sed
macOS下如何安装 gnu sed
macOS 下 sed 和 Linux 下的sed(也叫 gnu sed)表现略不同。 有何不同?可以看下这篇文章:http://zhouxiaohong.com/2016/08/02/sed-in-mac/。
可以用下面的方法安装 gnu sed:
$ brew install gnu-sed
gnu sed 会安装在 /usr/local/Cellar/gnu-sed/4.5/bin 目录下。名为 gsed,然后 alias 成 sed 即可。若遇到 permission denied: gsed 的问题,使用下列命令为其增加执行权限即可:
$ sudo chmod +x /usr/local/Cellar/gnu-sed/4.5/bin/gsed
示例1:统计文件行数
文件的内容每个代码示例中的文件初始内容: test.txt 文件原始内容:
第1行
第2行
第3行
第4行
第5行
统计文件行数:
$ sed -n '$=' test.txt
5
示例2:删除部分行
用 cat 显示每一行行号和内容:
$ cat -n test.txt
1 第1行
2 第2行
3 第3行
4 第4行
5 第5行
显示结果中删除第2行:
方式1(带行号):
$ cat -n test.txt | sed '2d'
1 第1行
3 第3行
4 第4行
5 第5行
方式2:
$ sed '2d' test.txt
第1行
第3行
第4行
第5行
方式3:
$ sed -e '2d' test.txt
第1行
第3行
第4行
第5行
显示结果中删除2到5行:
$ sed '2,5d' test.txt
第1行
显示结果中删除第2行和第4行:
$ sed -e '2d' -e '4d' test.txt
第1行
第3行
第5行
显示结果中删除最后一行:
$ sed -e '$d' test.txt
第1行
第2行
第3行
第4行
示例3:插入行
第2行后添加内容:
$ sed '2a hello' test.txt
第1行
第2行
hello
第3行
第4行
第5行
$ sed -e 2a\hello test.txt
第1行
第2行
hello
第3行
第4行
第5行
在最后一行添加内容:
$ sed '$a hello' test.txt
第1行
第2行
第3行
第4行
第5行
hello
上面只是在终端的显示结果中插入行,如何在文件中直接插入行?不急,会在下面介绍。
搜索
搜索含有「行」的内容:
$ sed '/行/p' test.txt
第1行
第1行
第2行
第2行
第3行
第3行
第4行
第4行
第5行
第5行
搜索含有「第1行」的内容:
$ sed '/第1行/p' test.txt
第1行
第1行
第2行
第3行
第4行
第5行
可以看到,这种搜索会会依次输出每一行,若匹配了,会再输出一次。怎么才能只输出匹配结果?用参数 -n:
$ sed -n '/第1行/p' test.txt
第1行
删除匹配的行
$ sed '/第1行/d' test.txt
第2行
第3行
第4行
第5行
搜索并替换
将「第1行」换成「第一行」:
$ sed 's/第1行/第一行/g' test.txt
第一行
第2行
第3行
第4行
第5行
将第1行的「第1」去掉:
$ sed -e 's/^.*1//g' test.txt
行
第2行
第3行
第4行
第5行
修改文件内容
使用 -i 可以直接修改文件:
$ sed -i 's/第1行/第一行/g' test.txt
$ cat test.txt
第一行
第2行
第3行
第4行
第5行
$ sed -i '2a hello' test.txt
$ cat test.txt
第一行
第2行
hello
第3行
第4行
第5行
$ sed -i '$a world' test.txt
$ cat test.txt
第一行
第2行
hello
第3行
第4行
第5行
world
因为会直接修改文件,所以要慎重!-i 还有一个功能,就是在处理文件前先备份文件。例如下面的命令,是在第5行后写入123456,但是在处理文件之前,会先生成test.txt 的备份文件 test.txt.bak 。
$ sed -i.bak '5a 123456' test.txt
同时修改多个文件的内容
例如将当前目录下的所有Hello
,替换为你好
:
$ sed -i 's/Hello/你好/g' `grep "Hello" -rl .`