使用awk替换文本的第一个出现

4
以下代码用banana替换第一次出现的apple。 使用awk / gawk如何实现相同的功能?
sed -i "0,/apple/s//banana/" myfile.txt
1个回答

8

这是我想到的:

awk '!x{x=sub("apple","banana")}7' file

例如:
kent$  cat f
foo
apple
foo
apple
apple

kent$  awk '!x{x=sub("apple","banana")}7' f
foo
banana
foo
apple
apple

对于 sed -i(就地更改)部分,如果您使用的是gawk 4.1.0,则也有这个选项。否则,您必须使用临时文件。


你正在使用 7。太有趣了! :) +1 - hek2mgl
以前从未见过这个。但是除了 0 之外的任何数字都是有效的,就像我非常喜欢 awk 一样!但如果你问我,在这里使用 sed 更合适(这就是为什么我给出了那个答案)... - hek2mgl
1
@MohammedNoureldin 因为在 awk 中,非零数字会默认执行 print 操作。 - Kent
1
@MohammedNoureldin 没有区别。我更喜欢右手食指,所以我选择了7。 - Kent
4
为了更易读懂,命令的另一种形式是:awk '!x{x=sub("apple","banana")}{print $0}' test。如果将{print}替换为数字(任何非零数都为真),则{print}为真(即使没有写)。语法!x{...}的意思是:如果x != false(即它有一个值),则执行某些操作。对于任何具有基本知识的程序员来说,其余部分应该是清晰的。 - Mohammed Noureldin
显示剩余14条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接