从多个文件的第一行替换字符串

时间:2016-11-12 18:35:29

标签: perl file unix replace sed

我有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/' *

输出没有变化。

2 个答案:

答案 0 :(得分:2)

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

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

  3. 使用\.按字面匹配一个点,.匹配任何内容。

    sed -i~ -e '1s=supersonic\./=supersonic.com/=' *
    
  4. 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