Sed 或 AWK:在一系列行号之间每次出现模式后添加行

Sed 或 AWK:在一系列行号之间每次出现模式后添加行

我需要在每次出现模式后添加一行文本。我需要这个:

pattern1
pattern2

看起来像这样

pattern1
pattern2
new line data here

新的行数据将始终出现在模式 2 之后。 patter2 总是相同的,并且 patter2 出现了 100 多次。我只想在第 226 行和第 2858 行之间看到模式 2 时执行此操作。我想进行就地修改并完成所有这一切,而不擦除文件中的其他任何内容。 (测试时已经做过一次,不想再做一次)

更新 - 我需要更精确,因为我的模式包含特殊字符。所以我实际上正在改变这个:

pattern1
pattern2 { text; };

对此

pattern1
pattern2 { text; };
new data { text; text; text; };

因此,匹配包含特殊字符的模式 2,并添加带有特殊字符的新数据行。之前就应该透露这一点。抱歉造成任何混乱。

答案1

你可以用 vim 做到这一点!

vim file.txt -c "226,2858g/pattern2/normal onew line data here" -c "wq"

您还可以通过以下方式交互地执行此操作:

vim file.txt
:226,2858g/pattern2/normal onew line data here
:wq

哪条路是我更愿意这样做,但如果你更喜欢第一个,我会理解,因为不熟悉 vim。

这两种工作方式都是通过调用 vim 的:global命令:

                        *:g* *:global* *E147* *E148*
:[range]g[lobal]/{pattern}/[cmd]
            Execute the Ex command [cmd] (default ":p") on the
            lines within [range] where {pattern} matches.

在本例中,范围为第 226-2858 行,模式为“pattern2”,ex 命令为

normal onew line data here

它的作用是所谓的“正常”,意思是“输入以下键,就像我键入它们一样”。键入“o”键 (o) 将在当前行下方添加一个新行,并进入插入模式。然后,在插入模式下,文本“此处为新行数据”被插入到文件中。

下一个命令-c "wq"只是 (w)rite 和 (q)uit。

如果您的“模式”使用正则表达式,您可能应该通读这个精彩的页面帮助您排除模式匹配是否正确的故障。

答案2

sed "226,2858s/^\(pattern2.*\)/\1\nnew line data here/g" -i data.txt

相关内容