【问题标题】:find the first occurrence of a word an edit the line next to it using sed command找到第一个出现的单词并使用 sed 命令编辑它旁边的行
【发布时间】:2020-12-10 05:52:45
【问题描述】:

我有一个包含多行单词“string”的文件。我只想编辑/替换文件中第一次出现“字符串”旁边的整行

我试过这个 sed -i '/string/{n;s/.*/new-string/1}' 测试文件

但是在其他“字符串”出现后,我正在获取所有其他行的更新

【问题讨论】:

  • sed 是一个糟糕的工具选择,但你得到了你所问问题的答案,所以如果你想看到更好的方法,那么请提出一个新问题,这一次用awk标记它。

标签: sed command-line


【解决方案1】:

你可以使用这个:

sed '/string/{n;s/.*/new_string/;:a;n;ba}' input.file

我添加了:a;n;ba 命令:

:a # defines a label 'a'
n  # read next line of input
ba # branch (jump) to label a

这实际上是一个遍历剩余行直到文件末尾的循环,该文件将打印剩余的每一行都保持不变。

【讨论】:

  • 值得指出的是,通常习语s/.*/replacement/ 会建议c replacement,但是c 命令的作用与d 的作用相同,并且该循环不会执行进一步的命令.因此,:a;n;ba 的命令集将永远无法到达,并且文件中的其他行可能会被替换。
【解决方案2】:

我会使用ed 而不是sed:

ed -s test-file <<EOF
/string/+1c
new string
.
w
EOF

用new string 替换正则表达式string 的第一个匹配之后的行并保存更改。

【讨论】:

    【解决方案3】:

    这可能对你有用(GNU sed):

    sed 'x;/./{x;b};x;/string/!b;h;n;c new_string' file
    

    使用保持空间作为标志,如果设置,则缩短任何进一步的处理。

    注意sed -e '/string/{n;c new_string' -e ':a;n;ba}' file 可能看起来有效,但会引入错误(请参阅@hek2mgl 解决方案中的评论)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 2014-10-16
      • 1970-01-01
      • 2023-03-14
      • 2018-12-17
      • 2022-11-30
      • 1970-01-01
      • 2022-01-27
      相关资源
      最近更新 更多