我有10,000个文本文件,我必须进行更改。
每个文件的第一行都包含一个网址。
错误的几个文件url missking'com'
eg:
1) http://www.supersonic./psychology
2) http://www.supersonic./social
3) http://www.supersonic.com/science
我的任务是检查并添加“com”(如果缺少)
eg:
1) http://www.supersonic.com/psychology
2) http://www.supersonic.com/social
3) http://www.supersonic.com/science
所有网址都属于同一个域名(supersonic.com)
你可以建议我快速简单的方法吗?尝试过:将supersonic./
替换为supersonic.com
sed -e '1s/supersonic.//supersonic.com/' *
输出没有变化。
答案 0 :(得分:2)
使用-i
更改文件,而不是仅输出更改的行。
如果要在正则表达式中使用/
(或在正则表达式中使用/
),请使用与\/
不同的分隔符。
使用\.
按字面匹配一个点,.
匹配任何内容。
sed -i~ -e '1s=supersonic\./=supersonic.com/=' *
sed
的某些版本不支持-i
。
答案 1 :(得分:1)
您与代码非常接近,但您需要在/
字符后面考虑尾随.
字符。
假设您正在使用带sed
(inplace-edit)选项的现代-i
sed -i '1s@supersonic\./@supersonic.com/@' *
请注意,您不必在/
内转义s/srchpat\/withSlash/replaceStr/'
,而是可以在s
命令之后使用另一个字符作为分隔符,这里我使用s@...@...@
。如果您的搜索模式有@
个字符,那么您将不得不使用不同的字符。
sed
的某些旧版本需要您在第一次使用时转义备用分隔符,所以
sed 's\@srchStr@ReplStr@' file
对于那些案件。
如果您使用的sed
不支持-i
选项,那么
您需要循环访问您的文件,并管理tmp文件,即
for f in *.html ; do
sed '1s@supersonic\./@supersonic.com/@' "$f" > /tmp/"$f".fix \
&& /bin/mv /tmp/"$f".fix "$f"
done
警告强>
但是,当您谈论10,000 +文件时,在使用其中任何一种解决方案之前,您都希望进行一些测试。将这些文件的随机集合复制到/ tmp / mySedTest / dir并在其中运行其中一个解决方案,以确保没有任何意外。
你有可能用10,000多个文件炸掉cmd-line MAX_SIZE,所以请阅读find和xargs。这里有很多关于[sed] find xargs
的帖子。如果需要,请检查它们。
IHTH