【问题标题】:Using different delimiters in sed commands and range addresses在 sed 命令和范围地址中使用不同的分隔符
【发布时间】:2011-08-17 08:59:12
【问题描述】:

我在 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'

我能做什么?

【问题讨论】:

  • sed statement <<< cat
  • @geirha 不确定你的意思。
  • 试试sed 'sahanag' <<< "haha"。在您的 aaa 示例中,它失败只是因为正则表达式为空白并且您要么分支到未标记的位置,并且 g 命令需要用分号分隔 - 要么 - 您正在分支到未标记的 ag 位置。您还可以使用不可打印的字符进行分隔,例如SOH $'\001'。你可以在这里看到一个工作示例:github.com/AdamDanischewski/gen-uniq-id/blob/master/…
  • 这能回答你的问题吗? How to pass a variable containing slashes to sed
  • 真正的问题是哪个分隔符是最好的????

标签: sed delimiter


【解决方案1】:

您可以通过反斜杠使用替代正则表达式分隔符作为搜索模式:

sed '\,some/path,d'

只需将它原样用于s 命令:

sed 's,some/path,other/path,'

不过,您可能想要保护其他元字符;这是使用 Perl 和 quotemeta 或其他脚本语言的等价物的好地方。

来自man sed

/<em>regexp</em>/
匹配匹配正则表达式regexp的行。

\c<em>regexp</em>c
匹配匹配正则表达式 regexp 的行。 c 可以是反斜杠或换行符以外的任何字符。

s/regular expression/replacement/flags
用替换字符串替换模式空间中正则表达式的第一个实例。可以使用除反斜杠或换行符以外的任何字符代替斜杠来分隔 RE 和替换。在 RE 和替换中,如果 RE 分隔符前面有反斜杠,则它本身可以用作文字字符。

【讨论】:

    【解决方案2】:

    可能是最接近标准的 POSIX/IEEE 开放组基本规范says

    [2addr] s/BRE/replacement/flags

    用替换字符串替换 BRE 中的实例 图案空间。 反斜杠或换行符以外的任何字符都可以 使用而不是斜线来分隔 BRE 和替换。 在 BRE 和替换中,BRE 分隔符本身可以是 如果前面有反斜杠,则用作文字字符。"

    【讨论】:

    • 注意必须是单字节字符。
    • 我不明白。我可以使用:sed 's\hello\HELLO\' filename,它可以工作。反斜杠有什么特别之处?
    • 那么您的 sed 可能不是 100% 符合 POSIX 规范!你在哪个平台上?
    • 这似乎包括标签?‍♂️
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多