替换重复的单词之一

替换重复的单词之一

嗨,我是新手,所以请耐心等待。我有一个 .txt 文件,我想在其中替换一个单词,但问题是,该单词一遍又一遍地重复(假设您有数百万行这样的行)

TOPIC:
APPLE
APPLE
APPLE
BANANA

我想像这样将第一次出现的 Apple 替换为 Mango

TOPIC:
MANGO
APPLE
APPLE
BANANA

有没有办法专门通过 sed 或 awk 来做到这一点(据我所知 sed 可用于替换单词,但不能用于替换多行输入 - 在我的情况下,我只想替换第一个单词)顺便说一句,如果它可以通过其他方式实现工具也很好

答案1

使用sed并假设总是有第一行说除以下内容之外的内容APPLE

sed '1,/APPLE/ s/APPLE/MANGO/' file

这将匹配从第 1 行到包含子字符串 的下一行APPLE。在这些行中,它将子字符串替换APPLEMANGO。效果是第一次出现APPLE 第一行之后被替换为MANGO.

使用 GNUsed你可以使用

sed '0,/APPLE/ s/APPLE/MANGO/' file

如果包含子字符串,这也将覆盖第一行APPLE


awk

awk '!found && /APPLE/ { sub("APPLE", "MANGO"); found = 1 }; 1' file

这会尝试查找APPLE每行上的子字符串,找到后,sub()调用会将子字符串替换为MANGO。然后标志变量found被设置为 1(布尔值真的value) 来阻止替换再次发生。每行,无论是否修改,都会无条件打印。


使用ed

printf '%s\n' '/APPLE/ s//MANGO/' ,p Q | ed -s file

这将搜索包含子字符串 的行APPLE。找到后,它会将该子字符串替换为MANGO.仅处理文件中的第一个匹配项。

编辑脚本

/APPLE/ s//MANGO/
,p
Q

执行搜索和替换,将整个编辑缓冲区打印到标准输出,然后无条件退出。

答案2

$ awk '$0=="APPLE" && !done++{ $0="MANGO" } 1' file
TOPIC:
MANGO
APPLE
APPLE
BANANA

答案3

使用perl

$ perl -lpe '$_ = "MANGO" if m?APPLE?' file

结果:-

TOPIC:
MANGO
APPLE
APPLE
BANANA

使用 POSIX sed 构造,我们还可以执行以下操作:

sed -e '
  1{x;s/^/MANGO/;x;}
  /APPLE/!b
  G
  /\n$/{P;d;}
  z;x
' file

替换zs/.*//POSIX sed。

相关内容