我在 shell 脚本中使用 sed 来编辑文件系统路径名。假设我想更换
/foo/bar
与
/baz/qux
但是,sed 的
s///
命令使用正斜杠 /
作为分隔符。如果我这样做,我会看到一条错误消息,例如:
▶ sed 's//foo/bar//baz/qux//' FILE
sed: 1: "s//foo/bar//baz/qux//": bad flag in substitute command: 'b'
同样,有时我想选择线条范围,例如图案
foo/bar
和baz/qux
之间的线条。再说一次,我不能这样做:
▶ sed '/foo/bar/,/baz/qux/d' FILE
sed: 1: "/foo/bar/,/baz/qux/d": undefined label 'ar/,/baz/qux/d'
我能做什么?
您可以通过反斜杠使用替代正则表达式分隔符作为搜索模式:
sed '\,some/path,d'
只需按原样使用
s
命令即可:
sed 's,some/path,other/path,'
不过,您可能想保护其他元字符;这是使用 Perl 和
quotemeta
或其他脚本语言中的等效项的好地方。
来自
man sed
:
/regexp/
匹配与正则表达式匹配的行.regexp
\cregexpc
匹配与正则表达式匹配的行。regexp
可以是除反斜杠或换行符之外的任何字符。c
s/regular expression/replacement/flags
将替换字符串替换为模式空间中正则表达式的第一个实例。可以使用反斜杠或换行符以外的任何字符代替斜杠来分隔 RE 和替换。在 RE 和替换中,如果 RE 分隔符前面有反斜杠,则它本身可以用作文字字符。
也许最接近标准的是 POSIX/IEEE 开放组基本规范说:
[2addr] s/BRE/替换/标志
将替换字符串替换为 BRE 实例 图案空间。 除反斜杠或换行符之外的任何字符都可以 使用而不是斜杠来分隔 BRE 和替换。 在 BRE 和替换中,BRE 分隔符本身可以是 如果前面有反斜杠,则用作文字字符。”
当原字符串或替换字符串中存在斜杠
/
时,我们需要使用\
进行转义。
sed 's/\/foo\/bar/\/baz\/qux/' file
在 Ubuntu 16.04 (
sed
4.2.2) 上测试。