在sed命令和范围地址中使用不同的分隔符

时间:2011-05-03 01:23:14

标签: sed

我在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/barbaz/qux之间的行。再说一次,我不能这样做:

▶ sed '/foo/bar/,/baz/qux/d' FILE
sed: 1: "/foo/bar/,/baz/qux/d": undefined label 'ar/,/baz/qux/d'

我该怎么办?

1 个答案:

答案 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分隔符本身可以用作文字字符。