我事先知道行号,并将它们保存在另一个文件中:
cat linenos
2
15
42
44
... etc
如您所见,这些行不相邻,因此我不能将一个范围用于sed
. 目标是修改目标文件行,例如,在它们前面加上像 MARKER 这样的标记
直截了当的方法是sed
多次调用来修改每一行:
for l in $(cat linenos)
do
sed -i "${l}s/^/MARKER/" target_file
done
这显然会多次调用 sed 。
注意:*这种方法不仅效率低下,而且如果修改不是像这样插入标记,它也会使事情出错。任何行删除或插入 sed 命令(如 dar)都会使 linenos 中的初始行号对于循环中的下一个 sed 运行无效。
你有什么建议来改进/优化它?
示例 linenos 文件
cat linenos
2
5
示例目标文件
cat target_file
line one
line two
line three
line four
line five
line six
修改后的 target_file 的预期结果
cat target_file
line one
MARKERline two
line three
line four
MARKERline five
line six
我想出的可能方法是动态创建 sed 场景
SEDCMD=$(for l in $(cat linenos); do echo -n "${l}s/^/MARK/;" ; done)
sed -i -e "$SEDCMD" targetfile
@steeldriver 的以下方法分享了这个想法,但更加优雅和简洁