我正在尝试编写一个bash脚本,它将修改文件中某个字符串的所有出现。
我有一个包含大量文本的文件,其中会出现urls。所有urls都采用以下格式:http://goo.gl/abc23(即goo.gl/,后面是4个或5个字母数字字符)。
我想做的是在所有urls中追加一个字符串。我设法(在用户Dan Fego的帮助下)用sed完成了这个任务,但是它只能通过附加一个静态字符串来工作。
我要寻找的是一种将不同的字符串附加到每个事件的方法。假设我有一个函数generatestring,它每次都会回显不同的字符串。我想在每个url中添加一个不同的生成字符串。http://goo.gl/abc23会变成http://goo.gl/abc23?GeneratedString1,http://goo.gl/JB007会变成http://goo.gl/JB007?GeneratedString2等等。
有没有人知道这是否能办到?有人告诉我,perl是可行的,但我对perl没有任何经验。所以我才在这里问。
提前感谢您的帮助。
发布于 2012-02-09 15:49:04
ETA:假设URL嵌入到其他文本中:
$ perl -lnwe 's#http://goo.gl/\w{5}\K\b# "?" . rand(100) #ge; print' googl.txt例如:
$ cat googl
random text here, and perhaps some html <a href="http://goo.gl/abc23">
more stuff http://goo.gl/abc23 foo fake link http://foo.bar/abc12
longer http://goo.gl/abc23123123 foo fake link http://foo.bar/abc12
$ perl -lnwe 's#http://goo.gl/\w{5}\K\b# "?" . rand(100) #ge; print' googl
random text here, and perhaps some html <a href="http://goo.gl/abc23?69.998515">
more stuff http://goo.gl/abc23?26.186867532985 foo fake link http://foo.bar/abc12
longer http://goo.gl/abc23123123 foo fake link http://foo.bar/abc12-l chomps文件并向print. -n添加换行符,在脚本周围添加一个while(<>)循环,这基本上意味着它要么从参数文件名读取,要么从STDIN读取。\K的意思是“保持匹配的文本”,\b是单词边界,因此不匹配部分字符串。
请注意,它仍然与http://goo.gl/abc12/foo匹配,但由于我不知道您的数据是什么样子,您必须确定哪些边界是可以接受的。
当然,rand(100)只是作为您打算使用的任何函数的占位符。
如果您需要脚本版本,下面是退出代码:
use strict;
use warnings;
BEGIN { $/ = "\n"; $\ = "\n"; }
while (<>) {
chomp;
s[http://goo.gl/\w{5}\K\b]['?' . rand(100);]eg;
print;
}https://stackoverflow.com/questions/9213719
复制相似问题