sed是linux上的一个常用命令,意思是stream editor,用来对输入或文件的内容进行处理。它不会修改原来的内容,而是将处理后的结果输出到stdout。
sed是一个极其强大的命令,完整地介绍它大概需要写一本书,我也只能介绍几个我个人比较常用的用法。
这个是我使用最多的场景,使用方法为:
sed ‘s/find/replace/’
下面来举个例子。
假设当前目录下有一个名叫c.txt的文件,内容如下
jobcenter-test-1
jobcenter-test-2
jobcenter-test-3
jobcenter-prod-1
jobcenter-prod-2
jobcenter-prod-3
我希望将里面的test修改为TEST,用法如下:
$ sed 's/test/TEST/' c.txt
jobcenter-TEST-1
jobcenter-TEST-2
jobcenter-TEST-3
jobcenter-prod-1
jobcenter-prod-2
jobcenter-prod-3
其中,三个’/'中间是两个正则表达式,所以结合正则表达式将会具备很强的处理能力。
如果我想同时把prod修改为PROD,则可以在此基础上再使用一次sed
$ sed 's/test/TEST/' c.txt |sed 's/prod/PROD/'
jobcenter-TEST-1
jobcenter-TEST-2
jobcenter-TEST-3
jobcenter-PROD-1
jobcenter-PROD-2
jobcenter-PROD-3
并且它不会修改本地文件的内容,只是将修改后的内容输出。
关于查找替换,还有一点要说明一下,默认情况下,查找替换在每行只会发生一次。下面的例子中,我希望将小写的e
替换为大写的E
,但每行只生效了一次
$ sed 's/e/E/' c.txt
jobcEnter-test-1
jobcEnter-test-2
jobcEnter-test-3
jobcEnter-prod-1
jobcEnter-prod-2
jobcEnter-prod-3
如果我希望替换所有的小写e
的话,需要在最后一个/
后面加上g
$ sed 's/e/E/g' c.txt
jobcEntEr-tEst-1
jobcEntEr-tEst-2
jobcEntEr-tEst-3
jobcEntEr-prod-1
jobcEntEr-prod-2
jobcEntEr-prod-3
sed有两种方式可以选取特定的行,分别是按照行号和配额某个正则表达式。
sed -n ‘3,5p’ file #输出第3到第5行
sed -n /regex/p’ file #输出内容能够匹配regex的行
下面来看下具体例子
$ sed -n '3,5p' c.txt
jobcenter-test-3
jobcenter-prod-1
jobcenter-prod-2
上面是输出了文件c.txt的第3至第5行
$ sed -n '/test/p' c.txt
jobcenter-test-1
jobcenter-test-2
jobcenter-test-3
上面输出了匹配test
的所有行
这种用法与选取行类似,或者说与选取行恰恰相反
sed ‘3,5d’ file #输出第3到第5行
sed /regex/d’ file #输出内容能够匹配regex的行
下面来看下具体的例子
$ sed '3,5d' c.txt
jobcenter-test-1
jobcenter-test-2
jobcenter-prod-3
上面是删除了第3至第5行,输出了其余的所有行。
$ sed '/test/d' c.txt
jobcenter-prod-1
jobcenter-prod-2
jobcenter-prod-3
上面的命令删除了含有test
的行,输出了其余的所有行