我在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'
我该怎么办?
答案 0 :(得分:53)
您可以通过反斜杠将替代正则表达式分隔符用作搜索模式:
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分隔符本身可以用作文字字符。