Linux sed 命令


#Linux#


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 .`

( 本文完 )