【问题标题】:replace a string from first line on multiple files从多个文件的第一行替换一个字符串
【发布时间】:2017-03-26 18:21:32
【问题描述】:

我有 10,000 个文本文件需要进行更改。

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

错误地为几个文件 url 错过了 '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.com替换supersonic./

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

输出没有变化。

【问题讨论】:

    标签: perl file unix replace sed


    【解决方案1】:
    1. 使用-i 更改文件,而不仅仅是输出更改的行。

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

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

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

    sed 的某些版本不支持-i

    【讨论】:

      【解决方案2】:

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

      假设您使用现代 sed-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/ 目录并在那里运行其中一个解决方案以确保没有意外。

      而且您很可能会用 10,000 多个文件破坏 cmd-line MAX_SIZE,因此请阅读有关 find 和 xargs 的信息。这里有很多关于[sed] find xargs 的帖子。如果需要,请查看它们。

      IHTH

      【讨论】:

        猜你喜欢
        • 2014-05-13
        • 2013-04-10
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        • 2015-03-28
        • 2018-05-07
        • 1970-01-01
        • 2023-03-26
        相关资源
        最近更新 更多