【问题标题】:Bash replace string where specific condition is trueBash替换特定条件为真的字符串
【发布时间】:2014-01-07 00:04:42
【问题描述】:

我正在尝试替换同一行中特定条件为真的字符串

我有一个包含几行的文件。我在以另一个单词(word3)开头的每一行中用另一个单词(word2)替换一个单词(word1)

例如:

foo moo see
kaa haa qee
foo dee see
uuu ooo rrr
foo dee laa

我想在以“foo”开头的每一行中用“raa”替换单词“see”。这样做会导致如下行:

foo moo raa
kaa haa qee
foo dee raa
uuu ooo rrr
foo dee laa

有人告诉我可以使用 sed 来执行此操作,但我不知道如何执行此操作。

请帮忙! (仅限 sed)

【问题讨论】:

    标签: bash shell replace sed


    【解决方案1】:

    这是非常基本的sed

    $ sed '/^foo/s/see/raa/g' file
    foo moo raa
    kaa haa qee
    foo dee raa
    uuu ooo rrr
    foo dee laa
    

    说明

    • sed 's/something/replacement/g'something 字符串替换为 replacementg 表示每次都可以完成。
    • 添加/^foo/ 使其仅考虑以foo 开头的行。
    • 如果您想就地编辑文件,即使用替换更新文件内容,请添加-ised -i.bak '/^foo/s/see/raa/g' filefile.bak 将包含以前的文件。

    更新

    如何使用变量而不是 foo,看,raa 吗? – 卡莱尔

    像这样并带有双引号:

    $ d="foo"
    $ e="see"
    $ sed "/^$d/s/$e/raa/g" file
    foo moo raa
    kaa haa qee
    foo dee raa
    uuu ooo rrr
    foo dee laa
    

    等等。

    【讨论】:

    • 如何使用变量而不是 foo,看,raa 吗?
    • 查看我的更新答案,@Khaleal 如果完成,请记住您可以接受答案。
    • 请注意单词中的特殊字符,例如 . * \ & ? + 在 s 中具有 sed 的含义。您的示例未显示其中任何一个,但您的所有文件中可能并非如此
    【解决方案2】:

    我知道它要求sed,但如果他们愿意,请发布awk 供其他人阅读。

    awk '/^foo/ {sub(/see/,"raa")}1' file
    

    【讨论】:

      猜你喜欢
      • 2023-02-06
      • 2015-01-16
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2022-06-16
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多