【问题标题】:Changing the line after a match on Linux在 Linux 上比赛后更改线路
【发布时间】:2022-01-27 01:55:13
【问题描述】:

我有一个文本文件 test.txt,其中包含以下条目:

a line of text
another line
asdf
vkqaoc
coeiam
cieksm
pqocqoci
xmckdow
cqpszls
etc
etc etc etc

我需要搜索一行并更改其后的行。我想出了以下使用 awk 的方法,它返回我想要更改的行,但我对 awk 不太擅长,我需要一种方法来修改该行:

awk '/cieksm/{getline; print}' ./test.txt
pqocqoci

如何使用 awk 修改该行以说 pqocqoci-changed 或者有更好的方法吗?非常感谢您的帮助并感谢您!

【问题讨论】:

  • This 可能会对您有所帮助。

标签: bash awk sed grep


【解决方案1】:

用标志来组织这种东西通常更容易:

awk 'f{$0 = $0 "-changed"} 1{print} { f=/cieksm/}' test.txt

或(使用默认规则)

awk 'f{$0 = $0 "-changed"} 1; { f=/cieksm/}' test.txt

【讨论】:

    【解决方案2】:

    使用 GNU sed

    $ sed '/cieksm/{n;s/.*/&-changed/}' input_file
    a line of text
    another line
    asdf
    vkqaoc
    coeiam
    cieksm
    pqocqoci-changed
    xmckdow
    cqpszls
    etc
    etc etc etc
    

    【讨论】:

    • 我认为只有 GNU sed -- 至少不适用于 BSD sed。
    • 表示s/.*/&-changed/ 的另一种方式是s/$/-changed/。或者如果.* 代表abc 那么cabc-changed
    【解决方案3】:

    不清楚(对我来说)预期的输出

    1. 只需将pqocqoci-changed 打印到标准输出?
    2. 将整个文件打印到标准输出,但将pqocqoci 更改为 pqocqoci-changed?
    3. 通过将pqocqoci更改为pqocqoci-changed来更新源文件?

    1:对OP当前awk代码的小修改:

    $ awk '/cieksm/{getline var; print var "-changed"}' ./test.txt
    pqocqoci-changed
    

    2:添加代码以将所有行转储到标准输出

    $ awk '{print}/cieksm/{getline var; print var "-changed"}' ./test.txt
    pqocqoci-changed
    
    a line of text
    another line
    asdf
    vkqaoc
    coeiam
    cieksm
    pqocqoci-changed
    xmckdow
    cqpszls
    etc
    etc etc etc
    

    3:使用GNU awk更新源文件:

    $ awk -i inplace '{print}/cieksm/{getline var; print var "-changed"}' ./test.txt
    $ cat ./test.txt
    a line of text
    another line
    asdf
    vkqaoc
    coeiam
    cieksm
    pqocqoci-changed
    xmckdow
    cqpszls
    etc
    etc etc etc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多