【问题标题】:Can I search/replace in multiple .txt files quickly from Terminal? [duplicate]我可以从终端快速搜索/替换多个 .txt 文件吗? [复制]
【发布时间】:2012-08-07 08:56:10
【问题描述】:

我有大约 100 个包含纯文本的 .txt 文件。不知何故,某些数据已损坏,需要查找/替换。

我需要搜索字符'--'并将其替换为长破折号:'-'。

有没有办法通过终端中的命令快速做到这一点?

我的目录中.txt文件的名字是按顺序编号的:1.txt、2.txt等

谢谢!

【问题讨论】:

标签: macos bash terminal replace


【解决方案1】:

GNU sed:

sed -i 's/--/—/g' *.txt

OSX BSD sed:

您需要指定备份文件扩展名。创建带有扩展名的备份文件:.txt.bak:

sed -i '.bak' 's/--/—/g' *.txt

要完全替换文件,请指定一个空扩展名:

sed -i '' 's/--/—/g' *.txt

【讨论】:

  • @Casper:很高兴我能帮上忙 :-)
  • 标题“On OSX”有什么意义?第一个示例不适用于 OS X 吗? [阅读@aid 的回答。] 哦。您能否谈谈第一个示例以及为什么不同以及在哪些平台上不同?另外,第二个示例是特定于 OS X 还是适用于 BSD?
  • @ChrisPage:当我第一次写这个答案时,我没有看到这个问题被标记为“OSX”。第一个示例只能使用 GNU sed。就个人而言,我对sed 的其他版本没有太多经验,但第二个示例应该可以使用 OSX/BSD sed。您可能会发现这很有帮助:stackoverflow.com/questions/5694228/…
【解决方案2】:

sed -i 's/--/–/g' *.txt 应该可以工作。 -i 到sed 的标志使它就地作用于文件,s 代表替换,g 使它替换同一行上多次出现的模式。查看sed 的文档了解更多信息。

编辑: 这适用于 GNU/Linux;事实证明,OSX 上的语法略有不同(参见 cmets 和接受的答案)。

【讨论】:

  • 所以我对命令行很陌生...我只是将您的命令放入带有文件的目录中的终端并得到:sed:1:“base1.txt”:未定义标签'ase1.txt'。有什么想法吗?谢谢!
  • 我刚刚意识到这些文件实际上并没有按照我在原始问题中描述的方式命名。它们被命名为 base1.txt、base2.txt 等。这会如何改变事情?
  • @Casper:它没有。 *.txt 读取当前工作目录中的每个 .txt 文件
  • 嗯,还是不行:sed: 1: "base1.txt": undefined label 'ase1.txt
  • @Casper: osx 上的sed 与GNU sed 的工作方式不同。使用-i 标志时,您需要指定备份文件的扩展名。
猜你喜欢
  • 2011-11-24
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多