【问题标题】:Linux, find replace on a folder of files using a list of items for replacement?Linux,使用替换项目列表在文件文件夹上查找替换?
【发布时间】:2016-05-17 04:08:09
【问题描述】:

我正在寻找一种方法来使用外部列表 (Replace.txt) 来替换 /temp 中包含 50 个文件的文件夹中的文本。

我的替换文件 Replace.txt 将类似于以下内容,但包含 400 多个项目。

Old,New
Apples, Oranges
Mellon, Bananas
Car, Train

例如

我可以使用 sed,但手动添加我的列表效率不高。不知道sed能不能用类似代码的外部文件列表。

代码:

sed -i 's/item1/itemb/g:s/itemc/itemd/g:s/iteme/itemf/g' *

有人有什么有用的吗?

【问题讨论】:

  • 这很常见也很容易。谷歌sed -f -
  • 顺便提一下,sed 命令用换行符或分号分隔,而不是冒号。
  • 因为我对 sed 不太熟悉,所以我很难找到正确的语法。在发布之前,我已经在 Google 上搜索了答案。

标签: sed


【解决方案1】:

您可以轻松地从输入文件生成sed 脚本...使用sed

sed 's/^/s%/;s/, */%/;s/$/%g/' Replace.txt | sed -f - -i /directory/*

管道中的第一个命令根据您的替换模式生成一个sed 脚本;看起来像

s%Old%New%g
s%Apples%Bananas%g

然后我们将其提供给另一个 sed 实例,指定标准输入 (-) 作为从 (-f) 读取脚本的文件,并将您要执行这些替换的文件指定为文件名论据。

s/^/s%/ 在行首插入s%s/, */%/ 仅将第一个逗号(带有可选的尾随空格)替换为 %s/$/%g/ 在每行末尾添加%g。 (在正则表达式中,^ 匹配行首,$ 匹配行尾。)

Linux sed 愉快地从标准输入中读取脚本;其他一些平台可能会受到阻碍,或者需要像 /dev/stdin 这样的解决方法,而不是 - 作为文件名参数。在最坏的情况下,将生成的脚本保存在一个临时文件中,然后在完成后将其删除。

也许注意到,这很乐意将PineApplesauce 替换为PineBananasauce,将BOldface 替换为BNewface。您也许可以围绕Old 文本设计一个更受约束的正则表达式。另请注意,如果 Old 包含正则表达式元字符,如果您希望 sed 逐字替换它们,则应将其转义;所以

s%your *new* friend%your *old* buddy%

错了,应该是这样的

s%your [*]new[*] friend%your *old* buddy%

如果意图是将“旧”短语解释为文字。

【讨论】:

  • 太棒了!我刚刚运行了一个示例,替换项的输出出现问题,它似乎使第一个字符翻了一番。 OOranges BBananas TTrain
  • 我不能在这里替换它。我想您会以某种方式错误地转录脚本;或者您的真实数据可能包含与您提供的苹果和橙子示例不同的正则表达式特殊字符。
  • 加倍问题上的用户错误,初始列表不正确。非常感谢您的帮助!
猜你喜欢
  • 2016-08-12
  • 2017-07-09
  • 1970-01-01
  • 2012-04-11
  • 2015-03-09
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
相关资源
最近更新 更多