Linux命令用另一个stringreplaceLARGE文件中的string

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

这怎么能从命令行完成呢?

Solutions Collecting From Web of "Linux命令用另一个stringreplaceLARGE文件中的string"

sed是大文件的不错选择。

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

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

流编辑器用于对输入流(来自管道的文件或输入)执行基本的文本转换。 虽然在某些方面类似于允许脚本编辑的编辑器(例如ed),但是sed通过对输入进行一次遍历来工作,因此更高效。 但是,sed能够在管道中筛选文本,这与其他类型的编辑者有着特别的区别。

相关的手册部分在这里 。 一个小的解释如下

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

s%foo%bar%使用s替换命令替换第二个字符串“bar”的%符号“foo”中第一个字符串的匹配。 它通常写成s //但是因为你的字符串有很多斜线,所以把它们换成别的东西比较方便,所以你不必逃避它们。

 vinko @ mithril:〜$ sed -i.bak -e's%C:// temp%// home // some // blah%'a.txt
 vinko @ mithril:〜$ more a.txt
 //首页// //一些废话
 d://温度
 //首页// //一些废话
 d://温度
 vinko @ mithril:〜$ more a.txt.bak
 C://温度
 d://温度
 C://温度
 d://温度

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

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

不需要反斜杠转义。 ;)

试试sed ? 就像是:

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

逃避所有这些斜杠使得这看起来很糟糕,但这是一个简单的例子,它将foo改为bar。

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

正如其他人已经指出,你可以选择自己的分隔符,这将防止在这种情况下倾斜的牙签综合征 :

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

关于sed的聪明之处在于,它一次运行在一个而不是一个文件上,所以你可以只使用适量的内存来处理大文件。

还有一个非标准的UNIX实用程序rpl ,它和sed例子完全相同。 但是,我不确定rpl是否是流式的,所以sed可能是更好的选择。

sed命令可以做到这一点。 与其跳过斜线,您可以选择不同的分隔符(在这种情况下为_):

 sed -e 's_c://temp/_/home//some//blah/_' file1.txt > file2.txt 
 perl -pi -e 's#c://temp#//home//some//blah#g' yourfilename 

-p将把这个脚本看作一个循环,它将逐行读取指定的文件,并运行正则表达式搜索并替换。

-i这个标志应该和-p标志一起使用。 这命令Perl编辑文件。

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

祝你好运

呆子

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