【问题标题】:awk or sed: append pattern to existing line after matchawk 或 sed:匹配后将模式附加到现有行
【发布时间】:2016-08-27 09:31:50
【问题描述】:

我正在寻找一种 sed 或 awk 解决方案,该解决方案将在模式的第一次匹配后将字符串插入文件中的现有行。例如我需要这个:

command arg arg2 -o another string and another string and so on

看起来像这样:

command "new string here" arg arg2 another string and another string and so on

如果我们匹配“command”,它只需要匹配第一次出现的“command”。

我不喜欢使用整行 sed 替换解决方案,因为实际行很长。 (并且我需要修改多行。)我遇到了无数关于使用 sed 或 awk 在文件中追加新行或将字符串追加到行尾或行首的解决方案,但尚未找到解决方案像我在这里需要做的那样插入一行的中间。

【问题讨论】:

  • 糟糕,您忘记发布代码了! StackOverflow 旨在帮助人们修复他们的代码。这不是免费的编码服务。任何代码都比没有代码好。元代码甚至可以展示您认为程序应该如何工作,即使您不知道如何编写它。

标签: bash awk sed


【解决方案1】:

你可以用 awk 实现它:

awk '$1 ~ /command/ { s = ""; for (i = 2; i <= NF; i++) s = s $i " "; print $1 " " "new string here" " " s }'

【讨论】:

  • 这使得更改非常需要,但对我来说存在另一个问题,由于我的 awk 版本,我无法进行就地修改,并且将副本发送到 stdout 只会在我需要时发送更改更改文件的其余部分。我需要就此发布一个新问题。
  • 您可以将stdout 的输出重定向到文件,并在命令末尾附加&gt; newfile.txt
  • 那行不通。它仍然会擦除文件的其他内容。我正在使用 文件 > newfile.
  • 你的意思是它会擦除文件的内容?和newfile有区别吗?
【解决方案2】:

sed 版本:

sed -n 's/^\(command\)\(.*\)/\1 "new string here"\2/p'
  • s -- 替代
  • ^ -- 行首
  • () -- 捕获组 1
  • 命令——文字字符串
  • () -- 捕获组 2
  • .* -- 其他所有内容都在线
  • \1 -- 捕获组 1 的内容
  • "这里的新字符串" -- 文字字符串
  • \2 -- 捕获组 2
  • p -- 打印出来

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多