替换
匹配到的内容。
提取
匹配到的内容。
s/regular expression/content/[xg]
m[,n]s/regular expression/content/[xg]
m,n,x ∈ [0, +∞]
xg
表示忽略前面x-1
行,从第x
行开始进行替换。
s
命令通常与-i
选项一起使用。
注意:紧跟着s
后面的一个字符被视作分割字符
,常用的分割字符
有/
、#
、@
等。regular expression
或content
中出现了分割字符
的时候要么进行转义,要么就换成其他的分割字符
。
示例1 ⤵︎
sed -i 's/fonts.googleapis.com/www.googlefonts.net/g' $(grep "fonts.googleapis.com" -rl ./)
示例2 ⤵︎
sed -i 's@downloads.openwrt.org@mirrors.tuna.tsinghua.edu.cn/lede@g' /etc/opkg/distfeeds.conf
这里用@
作为分割字符
而没有使用/
作为分割字符
的原因是/
在后面的替换内容中出现了,为了表达式的清晰,而换了一个分割字符
。
示例3 ⤵︎
sed 's/^[ ]*//g' xx.txt
删除行首的空格。
示例4 ⤵︎
sed 's/[ ]*$//g' xx.txt
删除行尾的空格。
示例5 ⤵︎
echo " abcd " | sed 's/^[ ]*//' | sed 's/[ ]*$//'
echo " abcd " | sed -e 's/^[ ]*//' -e 's/[ ]*$//'
删除行首和行尾的空格,相当于trim
。
示例6 ⤵︎
sed -i "s/^/--&/g" xx.txt
在每行的开头添加字符。^
代表行首。
示例7 ⤵︎
sed -i "s/$/&--/g" xx.txt
在每行的结尾添加字符。$
代表行尾。
示例8 ⤵︎
echo "plugins=(zsh-syntax-highlighting zsh-autosuggestions)" | sed 's/).*$//'
将匹配到的内容替换为空格
。
在正则表达式
中,为了便于提取
某个模式匹配到的内容,会对某个模式进行分组
。sed
也支持对分组
的引用
,在sed
中,最多支持对9
个分组
的引用
。
在正则表达式
中,(patten)
表示一个分组,但是在sed
中,要提取它,必须用\(patten\)
。
示例:
echo "english names=(wang dogs haha)" | sed 's/.*names=(\(.*\)).*/\1/'
这里,首先提取
出括号中的内容wang dogs haha
,并用它替换掉english names=(wang dogs haha)
,这样,实际上得到的就是提取
出的内容。
$
代表匹配到的内容。
示例:
echo "wang dogs haha" | sed 's/\w\+/[&]/g'