如何将一个字符串附加到文件中另一个字符串的所有出现位置

3
我想编写一个bash脚本,能够修改文件中出现的特定字符串。我的文本文件中包含许多URL链接,格式如下:http://goo.gl/abc23(即goo.gl/后面跟着4或5个字母数字字符)。我想对所有的链接添加一个字符串,例如:http://goo.gl/abc23将变为http://goo.gl/abc23?AStringhttp://goo.gl/JB007将变为http://goo.gl/JB007?AString等等。我已经尝试使用sed(搜索和替换)和正则表达式,但不知道如何仅仅添加一个字符串而不是替换它。我对bash和正则表达式并不熟悉,请问有谁可以帮助我吗?非常感谢!

在URL后面有什么分隔符吗? - Toto
3个回答

4

使用sed,你的方法是“用当前字符串替换为当前字符串加上另一个字符串”。因此,如果你有一些正则表达式来匹配所有的URL(因为我不想即兴编写):

sed 's/myregex/&?AString/g' myfile.txt

你需要将完整的正则表达式替换myregex&字符将匹配到的整个字符串放在右侧,而替换操作的其余部分加上?AString。末尾的g告诉sed替换一行中的所有匹配实例,而不仅仅是第一个。


太棒了,它起作用了。我不知道有 & 这个符号。我一直试着用 $ 和 $1 等等。 - zigamilek
现在,有没有一种方法可以为每个出现添加不同的字符串?假设我有一个函数generatestring,每次都会回显不同的字符串。如果我使用sed "s/http:\/\/goo.gl\/...../&?$(generatestring)/g"调用它,它(预期)每次都写入相同的字符串。有什么想法可以让我每次写入不同的字符串? - zigamilek
@user1199569 如果字符串不是从你要附加的字符串派生出来的(即子集或其他),我不确定你如何在没有大量sed命令的情况下完成。如果是这种情况,也许可以考虑使用perl。话虽如此,请尝试一下,如果你无法弄清楚,请在SO上发布一个单独的问题!;) - Dan Fego

0

使用 Perl 的方式来实现,假设 URL 以空格结尾:

perl -pne 's#(http://\S+)#$1?AString#g' input_file

1
使用Perl时,如果您使用$&而不是$1,则不需要捕获括号。 - glenn jackman

0

你可以使用sed替换字符串的结尾($):

sed 's/$/?AString/' input.txt

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