我有一个巨大的SQL文件,可以在服务器上执行。转储来自我的机器,其中有一些与我的机器相关的设置。基本上,我希望每个"c://temp"
的出现都被"//home//some//blah"
如何从命令行完成?
答案 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