我正在尝试搜索并替换许多文件。我首先考虑使用'sed',但我认为我的要求可能会让'sed'不合适。
简而言之,假设我有一个包含4次'KEYWORD'的文件。它们在一条线上发生一次,但在4条不同的线上发生。
问题:我可以使用'sed'来替换前两次出现。如果没有,请您推荐Linux中提供的其他工具。目前,我们不讨论如何使用编程语言(python,ruby,java)来实现这一目标。
我遇到过如何在一行内更改K个出现次数,但我还没有看到如何替换K个行出现次数(如果你知道我的意思)。
如果您有任何想法,请告诉我。
答案 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”位。