代码之家  ›  专栏  ›  技术社区  ›  rockstardev

用另一个字符串替换大文件中的字符串的Linux命令

  •  8
  • rockstardev  · 技术社区  · 16 年前

    我有一个在服务器上执行的大型SQL文件。转储文件来自我的机器,其中有一些与我的机器相关的设置。所以基本上,我希望 "c://temp" 替换为 "//home//some//blah"

    如何在命令行中完成这项工作?

    7 回复  |  直到 16 年前
        1
  •  29
  •   Vinko Vrsalovic    16 年前

    sed 是大文件的好选择。

    sed -i.bak -e 's%C://temp%//home//some//blah%' large_file.sql
    

    这是一个很好的选择,因为不会同时读取整个文件来更改它。引用手册:

    流编辑器用于执行 输入的基本文本转换 流(来自 管道)。虽然在某些方面类似 到允许脚本化的编辑器 编辑(如ed),sed工作 只通过一次 输入,因此更多 效率高。但这是塞德的能力 筛选管道中的文本 它与 其他类型的编辑器。

    相关手册部分是 here . 下面是一个小解释

    -i.bak启用就地编辑,保留扩展名为.bak的备份副本

    s%foo%bar%使用s,替换命令, 替换第一个字符串的匹配项 在第二个符号“foo”之间 字符串,“bar”。通常写的是// 但因为你的弦有很多 对于斜线,更方便 把它们换成别的东西,这样你 避免不得不逃离他们。

    例子

    vinko@mithril:~$ sed -i.bak -e 's%C://temp%//home//some//blah%' a.txt
    vinko@mithril:~$ more a.txt
    //home//some//blah
    D://temp
    //home//some//blah
    D://temp
    vinko@mithril:~$ more a.txt.bak
    C://temp
    D://temp
    C://temp
    D://temp
    
        2
  •  12
  •   ire_and_curses    16 年前

    只是为了完整。就地更换使用 perl .

    perl -i -p -e 's{c://temp}{//home//some//blah}g' mysql.dmp
    

    也不需要反斜杠转义。;)

        3
  •  4
  •   Paul Dixon    16 年前

    尝试 sed ?类似:

    sed 's/c:\/\/temp/\/\/home\/\/some\/\/blah/' mydump.sql > fixeddump.sql
    

    但是,逃避所有这些斜线让这看起来很可怕,这里有一个简单的例子,它将foo改为bar。

    sed 's/foo/bar/' mydump.sql > fixeddump.sql
    

    正如其他人所指出的,您可以选择自己的分隔符,这将阻止 leaning toothpick syndrome 在这种情况下:

    sed 's|c://temp\\|home//some//blah|' mydump.sql > fixeddump.sql
    

    Sed的聪明之处在于它在 流动 而不是同时处理一个文件,因此您可以只使用少量的内存来处理大型文件。

        4
  •  3
  •   Meredith L. Patterson    16 年前

    还有一个非标准的Unix实用程序, rpl 这和 sed 但是,我不确定 rpl 以流方式操作,因此 塞德 可能是更好的选择。

        5
  •  1
  •   stefanw    16 年前

    这个 sed 命令可以做到这一点。 您可以选择不同的分隔符(u,在本例中),而不是转义斜杠:

    sed -e 's_c://temp/_/home//some//blah/_' file1.txt > file2.txt
    
        6
  •  1
  •   Logan    16 年前
    perl -pi -e 's#c://temp#//home//some//blah#g' yourfilename
    

    -p将把这个脚本视为一个循环,它将一行一行地读取指定的文件,运行regex搜索和替换。

    -i此标志应与-p标志一起使用。这命令Perl就地编辑文件。

    -e只意味着执行这个Perl代码。

    祝你好运

        7
  •  1
  •   ghostdog74    16 年前

    呆呆地

    awk '{gsub("c://temp","//home//some//blah")}1' file