我正在尝试使用命令搜索文件中的特定行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
这首先输出当前行。然后,它Samsung
用prefix
、空格和匹配的字符串(将在替换字符串中扩展为的内容)替换该字符串&
,从而有效地将字符串插入到每行的prefix
前面。如果替换成功,则打印修改后的行,从而在输出中创建一个额外的新行。Samsung
Samsung
然后输出被写入一个新文件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