2016-11-12 63 views
0

我有10,000个文本文件,我必须进行更改。从多个文件的第一行替换字符串

每个文件的第一行包含一个url。

搞错了几个文件的URL,如果它丢失

eg: 
    1) http://www.supersonic.com/psychology 
    2) http://www.supersonic.com/social 
    3) http://www.supersonic.com/science 

missking“COM”

eg: 
1) http://www.supersonic./psychology 
2) http://www.supersonic./social 
3) http://www.supersonic.com/science 

我的任务是检查和添加“COM”的所有URL相同的域(超音速.com)

你能告诉我任何快速简便的方法吗?

尝试这样做:用supersonic.com

sed -e '1s/supersonic.//supersonic.com/' * 

在输出没有变化更换supersonic./

回答

1

您与您的代码非常接近,但您需要在. char之后考虑尾随/ char。

假设你使用的是最新sed-i(就地编辑)选项,你可以做

sed -i '[email protected]\./@supersonic.com/@' * 

注意,而不是要逃避/s/srchpat\/withSlash/replaceStr/'的里面,你可以使用另一个字符后以s命令作为分隔符,这里我使用[email protected]@[email protected]。如果您的搜索模式有一个@字符,那么您将不得不使用不同的字符。

有些老版本的sed需要你在第一次使用逃脱其它分隔,所以

 sed 's\@[email protected]@' file 

对于这些情况。

如果您使用的sed不支持-i选项,那么您需要在文件上循环并管理tmp文件,即

for f in *.html ; do 
    sed '[email protected]\./@supersonic.com/@' "$f" > /tmp/"$f".fix \ 
    && /bin/mv /tmp/"$f".fix "$f" 
done 

警告

但正如你说的大约10,000 +文件,你会想要使用这两种解决方案之前做一些测试。将一组随机的文件复制到/ tmp/mySedTest/dir,然后运行其中一个解决方案,以确保没有任何意外。

而且,您可能会用10,000个文件吹出cmd行MAX_SIZE,因此请阅读find和xargs。这里有很多关于[sed] find xargs的帖子。如果需要检查出来。

IHTH

2
  1. 使用-i更改文件,而不是仅输出更改的行。

  2. 如果要在正则表达式中使用/(或在正则表达式中使用\/),请使用与/不同的分隔符。

  3. 使用\.来匹配一个字面,.匹配任何东西。

    sed -i~ -e '1s=supersonic\./=supersonic.com/=' * 
    

sed一些版本不支持-i