如何复制与字符串匹配的整行并在其后面粘贴带有前缀?

如何复制与字符串匹配的整行并在其后面粘贴带有前缀?

我正在尝试使用命令搜索文件中的特定行grep,并且我成功地做到了这一点。

现在我想将整行复制到原始行之后的新行中。换句话说,原始行后面应该跟着内容相同但带有一些前缀的新行。

例如: 原始数据:

Apple 
Samsung
Nokia
HTC

假设我希望新数据看起来像

Apple
Samsung
prefix Samsung
Nokia
HTC

注意:我有多种模式Samsung,我发现它应该做同样的事情。

我尝试grep用管道连接sed但失败了。谁能帮我解决这个问题吗?

谢谢

答案1

您可以使用 来执行此操作awk

此处使用您的示例是一种方法。

awk '{print $0} /Samsung/ {print "prefix " $0}' filename

为您分解该语句: {print $0}就是打印整行

/Samsung/ {print "prefix " $0}表示打印“prefix”,后跟整行,但前提是该行包含 Samsung。

答案2

sed -n 'p;s/^Samsung$/prefix &/p' file >newfile

这首先输出当前行。然后,它Samsungprefix、空格和匹配的字符串(将在替换字符串中扩展为的内容)替换该字符串&,从而有效地将字符串插入到每行的prefix前面。如果替换成功,则打印修改后的行,从而在输出中创建一个额外的新行。SamsungSamsung

然后输出被写入一个新文件newfile.

如果要放宽字符串的匹配Samsung以使其匹配行上的任何位置,则使用,例如,

sed -n 'p;s/.*Samsung/prefix &/p' file >newfile

使用awk来实现与上述等效的:

awk '1; /^Samsung$/ { print "prefix", $0 }' file >newfile

lone1是 的一种快捷写法{ print },与 相同{ print $0 },输出当前行。

使用 just/Samsung/来匹配行上任何位置的字符串,Samsung而不是要求该行只是该字符串。

上述命令的混淆变体awk

awk '1; /^Samsung$/ && $0 = "prefix " $0' file >newfile

答案3

这是使用 GNU 的解决方案sed。它找到字符串“Samsung”并替换为自身,并添加一个具有匹配模式“Samsung”的新行,并在其开头添加“prefix”:

# doubled the example data to show it works on every line
$ sed 's/^Samsung$/&\nprefix &/' file
Apple 
Samsung
prefix Samsung
Nokia
HTC
Apple 
Samsung
prefix Samsung
Nokia
HTC

答案4

另一个 sed 实现,使用“保留空间”

sed '/Samsung/ {h; s/^/prefix /; H; g;}' file

参考:https://www.gnu.org/software/sed/manual/html_node/Other-Commands.html

相关内容