amazing-sed-on-Linux
文章目录
【注意】最后更新于 March 22, 2019,文中内容可能已过时,请谨慎使用。
记录一些少有用到的sed使用技巧。
正则匹配
sed 默认情况使用基本正则表达式(BRE),也就是有些元字符需要使用转义\
,加上 -E
或则-r
参数后即可变成扩展正则表达a(ERE)式情况。
grep 可以使用 -i
参数忽略大小写,而 sed 的 -i
参数表示直接修改源文件而不是输出到标准输出 stdout,在替换模式下也是可以使用参数忽略大小写的,就是在 表示全部(g)的位置放置i。sed 's/旧的东西/新的东西/ig' filename
。g
全部,i
大小写不敏感。
sed 可以使用行号,范围或则正则表达式限定和面代码的作用范围,如sed -n '1,3 p' filename
只打印1到3行,如果有多个命令,则使用;
分隔,{}
裹起来。sed -n '1, /匹配这个/ {s/old/new/;s%ba/ba%la/la%}' filename
,对于这个,使用正则表达式限定下界,普通情况我们使用两个/
将正则表达式裹起来,可以看到后面替换模式中我们使用%
而不是通常的/
作为分隔符,这对于字段中包含/
的情况会相当友好,不用使用\
转义。所以前面正则表达式限定的地方有没有可能使用自定义符号而不是/
?匹配网站链接、路径时需要注意,特别使用使用了变量的情况!!!有两种方式解决:
1. 使用\
对所有匹配内容中的/
转义,
2. 使用\
转义你自己的第一个限定符。
sed '/abc\/def/ {do something}' filename
,sed '\=abc/def= {do something}' filename
。效果如下:
追加多行
通常我们使用 a
加上我们需要添加的内容 最佳到指定位置。但是我们找遇到了如下错误:
使用\n
来表示换行如何,
这次我们成功了。那么我们只需要将包含多行的一个变量将 不可见的换行辅 替换成字符\n
即可追加这个多行变量到指定位置。那么如何将一个包含多行的变量变成一个使用符号\n
分隔的单行变量?
mult_lines="$(echo "$mult_lines"|sed ':a;N;s/\n/\\n/;ta;')"
,注意双引号的使用。这里使用a
作为自定义标示符(label)用于跳转,N
追加到模式空间,s
就是我们熟悉的替换,注意\\n
的使用。t
仅当最后一个替换命令修改了模式空间时才跳转到标签。如果未指定label,则跳转到脚本的末尾,扩展阅读。
还有一个细节需要提一下,就是$()
中我们使用\\n
,如果是使用` `
,那么需要使用\\\n
,一个应用例子。
其他
还没有…