sed是stream editor 流编辑器的偶写,是文本处理中非常重要的工具,可以完美的配合正则表达式使用,进行文本替换
sed ‘s/pattern/replace_string/’ file
cat file | set ‘s/pattern/replace_string/’
使用-i可以将替换的结果应用到源文件中
一般的使用者,会在替换完成后利用重定向来保存文件
sed ‘s/text/replace/’ file > newfile
mv newfile file
两者结合起来,只需要一行命令就可以搞定
sed -i ‘s/text/replace/’ file
我们这个替换,是替换每一行的第一处符合样式的内容,如果需要替换所有的符合内容,需要在命令尾部加上g参数
sed ‘s/pattern/replace_string/g’ file
后缀 /g意味着sed会替换每一处匹配
但是有时候需要跳过一些匹配,多以可以加上数字,来指定先忽略多少处匹配
需要从第N处开始匹配,就使用/Ng
字符 /在sed中作为定界符使用,可以像是下面一样使用任意的定界符
sed ‘s:text:replace:g’
sed ‘s|text|replace|g’
如果需要删除某些匹配字段的话
需要在后面加上d来进行表示删除操作
比如移除所有的空白行
sed ‘/^$/d’ file
/pattern/d会移除匹配样式的行
已经匹配的字符串标记&
用&标记匹配了的
例如
$echo this is an example | sed ‘s/\w\+[&]/g’
\w\表示匹配每一个单词,然后我们 [&] 替换它, &对于之前所匹配的单词
子串匹配标记\1
& 代表匹配给定样式的字符串,但我们可以匹配给定的样式的其中一部分
echo this is digit 7 in a number |sed ‘s/digit\ ([0-9]\)/\1/’
“s/digit \([0-9]\)/\1/”
this is 7 in a number
将\1表示的第一个子串,如果匹配了第二个子串,就是\2
比如下面的多个匹配,就是
echo seven EIGHT |sed ‘s/\([a-z]\+\)\([A-Z]\+\)/\2 \2/’
EIGHT seven
([a-z]\+\) 匹配了第一个单词,([A-Z]\+\) 匹配第二个单词, \1 \2来进行引用,这种引用称为向后引用 back referencing
搭配使用
使用多个sed命令来进行代替
sed ‘expression’ | sed ‘expression’
等价于
sed ‘expression; expression’
单引号配合sed来使用,说明是单纯的字符使用,如果是双引号的话,可以在sed表达式中使用一些变量,那么双引号就可以使用了
$text=hello
echo hello world | sed “s/$text/HELLO/”