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

时间:2009-08-07 10:52:00

标签: linux perl command-line sed awk

我有一个巨大的SQL文件,可以在服务器上执行。转储来自我的机器,其中有一些与我的机器相关的设置。基本上,我希望每个"c://temp"的出现都被"//home//some//blah"

取代

如何从命令行完成?

7 个答案:

答案 0 :(得分:29)

sed是大文件的不错选择。

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

这是一个不错的选择,因为不会立即读取整个文件来更改它。引用手册:

  

使用流编辑器执行   输入上的基本文本转换   stream(来自的文件或输入)   管道)。虽然在某些方面类似   允许编写脚本的编辑   编辑(如ed),sed的作品   只有一次通过   输入,因此更多   高效。但这是sed的能力   过滤管道中的文本   特别是区别于   其他类型的编辑。

相关手册部分为here

后面有一个小解释
  

-i.bak可以进行编辑,留下扩展名为.bak的备份副本

     

s%foo%bar%使用s,替换命令,即   替换第一个字符串的匹配   在%符号'foo'之间,为第二个   字符串,'bar'。它通常写成s //   但因为你的琴弦很多   斜线,它更方便   改变他们的东西,所以你   避免逃避他们。

实施例

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

答案 1 :(得分:12)

只是为了完整。使用perl进行替换。

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

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

答案 2 :(得分:4)

试试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的聪明之处在于它在而不是同时在一个文件上运行,因此您只需使用适量的内存即可处理大量文件。

答案 3 :(得分:3)

还有一个非标准的UNIX实用程序rpl,它与sed示例完全相同;但是,我不确定rpl是否按顺序运行,因此sed可能是更好的选择。

答案 4 :(得分:1)

sed命令可以做到这一点。 您可以选择不同的分隔符(在这种情况下为_),而不是转义斜杠:

sed -e 's_c://temp/_/home//some//blah/_' file1.txt > file2.txt

答案 5 :(得分:1)

perl -pi -e 's#c://temp#//home//some//blah#g' yourfilename

-p会将此脚本视为循环,它将逐行读取指定文件并运行正则表达式搜索并替换。

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

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

祝你好运

答案 6 :(得分:1)

gawk的

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