我可以使用'sed'来搜索和替换K个LINE事件吗?

时间:2016-01-12 20:23:08

标签: linux bash sed

我正在尝试搜索并替换许多文件。我首先考虑使用'sed',但我认为我的要求可能会让'sed'不合适。

简而言之,假设我有一个包含4次'KEYWORD'的文件。它们在一条线上发生一次,但在4条不同的线上发生。

问题:我可以使用'sed'来替换前两次出现。如果没有,请您推荐Linux中提供的其他工具。目前,我们不讨论如何使用编程语言(python,ruby,java)来实现这一目标。

我遇到过如何在一行内更改K个出现次数,但我还没有看到如何替换K个行出现次数(如果你知道我的意思)。

如果您有任何想法,请告诉我。

3 个答案:

答案 0 :(得分:4)

awk在这里可能很方便:

awk 'i<2{i+=sub(/KEYWORD/, "FOOBAR")} 1' file

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed -r '/KEYWORD/{G;h;/(\n[^\n]*){3}/!s/KEYWORD/REPLACEMENT/;s/\n.*//}' file

使用-r开关让眼睛更容易使用regexp。

专注于仅包含KEYWORD的行。

使用保留空间(HS)作为计算遇到KEYWORD的次数的变量。将保留空间附加到模式空间(PS),从而为附加的每一行引入换行符(\n)。换行符的独特之处在于,在正常处理中,它通过sed从模式空间中删除。附加HS后,用当前PS替换HS(准备下一次替换)。如果PS中少于3行,则将KEYWORD替换为REPLACEMENT。删除附加行并继续正常处理。

N.B。数字3(n + 1)可以更改为所需的数字,也可以通过删除替换的否定(!)反向,即替换前遇到的KEYWORDS的数量,受影响。

反思是一种更通用的解决方案:

sed -r '/KEYWORD/{G;h;/^[^\n]*(\n[^\n]*){1,2}$/s/KEYWORD/REPLACEMENT/;s/\n.*//}' file

答案 2 :(得分:1)

因为这也标有“sed”和乐趣(并且可能用来演示sed是如何而不是这里最好的工具):你可以使用

repl=2
for (( i = 0; i < repl; ++i )); do
    sed -i '0,/KEYWORD/ s//substitution/' infile
done

也就是说,无论多少次都要替换第一次出现。缺点:这会处理每个循环的整个文件,0地址(如果KEYWORD出现在第一行)是GNU sed扩展。

我很确定它可以在sed中完全完成(实际上,I am sure),但计数不是很好,请参阅sed手册中的“Incrementing a number”位。