【问题标题】:Back reference Regular Expression not working in sed反向引用正则表达式在 sed 中不起作用
【发布时间】:2018-04-18 17:27:17
【问题描述】:

团队,

我有一个包含以下数据的文件。

[root@ip-1-32-3-67 ~]# cat db

555

555

555

666

666

777

我需要在所有字符串前面添加字符串“First”

预期输出:

First: 555

First: 555

First: 555

First: 666

First: 666

First: 777

我的 sed 命令看起来像。

[root@ip-1-32-8-1 ~]# sed -e 's/\([0-9]+\)/First: \1/g' db

555

555

555

666

666

777

但输出没有添加First。请帮我找出我做错的地方。

【问题讨论】:

  • 使用sed -r ...,而不是-esed -r 's/[0-9]+/First &/'。执行内联替换:sed -i -r 's/[0-9]+/First &/' db
  • @Wiktor Stribiżew 请给我完整的命令
  • 使用sed -r 's/[0-9]+/First &/'。要执行内联替换:sed -i -r 's/[0-9]+/First &/' db。此外,sed 's/[0-9][0-9]*/First &/' 也可以使用。
  • @Wiktor Stribiżew 感谢它的工作。还有一个帮助如何进行多个反向引用示例:第一个:\1 和第二个:\2 等等如何做到这一点
  • 请用新字符串更新问题。字符串的格式是否始终相同?什么是预期的输出?实际上,这看起来像是一个不同的问题。

标签: regex linux sed


【解决方案1】:

您将 BRE POSIX 模式传递给 sed 命令,因此 ()+ 被视为文字字符。

您可以将-e 替换为-r 以使模式被解析为POSIX ERE,或者使用

sed 's/[0-9][0-9]*/First &/'

[0-9][0-9]* 匹配 1 个或多个数字,替换部分中的 & 插入整个匹配项。

【讨论】:

    【解决方案2】:

    您不需要g+ 在此上下文中没有特殊含义(BRE 语法)。如果您的文件如前所述,您可以使用:

    sed 's/^./First: &/' file
    

    【讨论】:

    • 感谢您的回复。命令工作正常。但是对于这个文件 (555)555-1212 (555)555-1213 期望输出:第一:(555)第二:555-第三:1213。如何实现上述输出
    • 使用sed 's/^\(([^)]*)\)\([0-9]*-\)\([0-9]*\)/First: \1\nSecond: \2\nThird: \3\n/' file
    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2012-12-18
    • 2015-12-18
    • 2019-01-30
    • 1970-01-01
    相关资源
    最近更新 更多