我有一个巨大的SQL文件需要在服务器上执行。这个转储文件来自我的机器,在其中有一些与我的机器相关的设置。因此,基本上,我希望将每个出现的"c://temp"替换为"//home//some//blah"。如何从命令行完成这个操作?
sed是处理大文件的不错选择。
sed -i.bak -e 's%C://temp%//home//some//blah%' large_file.sql
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这段代码是用sed命令将a.txt文件中的"C://temp"替换为"//home//some//blah",并备份原文件为a.txt.bak。more命令用于查看文件内容。
只是为了完整性。使用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
此外,还有一种非标准的UNIX实用工具rpl,它可以执行与sed
示例完全相同的操作。但是,我不确定rpl
是否按流进行操作,因此在这里使用sed
可能更好。
perl -pi -e 's#c://temp#//home//some//blah#g' yourfilename
-p选项将此脚本视为循环,它将逐行读取指定的文件并运行正则表达式搜索和替换。
-i此标志应与-p标志一起使用。这个命令让Perl原地编辑文件。
-e只是执行这个Perl代码的意思。
祝你好运
sed
命令可以实现这个功能。你可以选择一个不同的分隔符(在本例中为 _),而无需转义斜线。
sed -e 's_c://temp/_/home//some//blah/_' file1.txt > file2.txt
gawk
awk '{gsub("c://temp","//home//some//blah")}1' file