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

cod*_*ama 8 linux perl awk command-line sed

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

如何从命令行完成?

Vin*_*vic 29

sed是大文件的不错选择.

sed -i.bak -e 's%C://temp%//home//some//blah%' large_file.sql
Run Code Online (Sandbox Code Playgroud)

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

流编辑器用于对输入流(文件或来自管道的输入)执行基本文本转换.虽然在某些方面类似于允许脚本编辑(例如ed)的编辑器,但是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
//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 -e"s%C:// temp%/ home // some // blah%".此外,-i选项允许您在确定选项时将文件保存在原位. (2认同)

ire*_*ses 12

只是为了完整.到位使用替换perl.

perl -i -p -e 's{c://temp}{//home//some//blah}g' mysql.dmp
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,如果你使用没有扩展名的`-i`标志,你就得到*no backup*.如果你想要一个备份,试试`-i.bak`将进行就地编辑*和*给你一个原始备份为`original.bak`,几乎是免费的. (10认同)
  • @Jrockway:对你来说这很可爱我很确定,但它假设有问题的文件受版本控制,你知道-i.bak做了什么,并选择不使用它.我只是希望推荐-i开关的人花两秒钟来解释-i和-i.bak之间的区别.如果您使用的文件不受版本控制并且您输入一个简单的拼写错误(例如,忘记-p标志),那将会非常痛苦. (3认同)