嗨,我是新手,所以请耐心等待。我有一个 .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
。在这些行中,它将子字符串替换APPLE
为MANGO
。效果是第一次出现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
替换z
为s/.*//
POSIX sed。