【问题标题】:replace multiple strings in one line with sed用 sed 替换一行中的多个字符串
【发布时间】:2015-04-21 07:36:16
【问题描述】:

我有一个包名列表,想删除一些带有sed的包名

echo "package1 package2 package24 package44 package66 package12345" > benoetigte_pakete.list

如何删除其他列表中的一些?

dellist="package24|package66"

我试过了

cat benoetigte_pakete.list | sed "s/(package24|package66)//"

但这不起作用。

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    sed 正则表达式中,您必须转义(|)

    您还需要使用g 修饰符,以便它替换该行中的所有匹配项,而不仅仅是第一个匹配项。

    dellist="package24|package66"
    # escape the pipes
    dellist=${dellist//|/\\|}
    sed "s/\b\($dellist\)\b//g" benoietigte_packete.list
    

    我添加了\b,所以它只匹配整个单词。

    根据您拥有的sed 版本,您还可以使用-E-r 选项来使用扩展正则表达式。

    【讨论】:

    • 有没有办法在管道前自动添加那些`\`?
    • 你可以使用字符串替换来添加反斜杠,看我的更新
    • 为什么不直接使用-r-E| 不需要在扩展的正则表达式语法中转义。
    • 我现在使用-r 没有管道转义(debian wheezy)。非常感谢!
    • 您需要添加一些括号和锚点,否则会将package246 更改为6 等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多