【问题标题】:Bash - Search and Replace operation with reporting the files and lines that has changed [duplicate]Bash - 搜索和替换操作,报告已更改的文件和行[重复]
【发布时间】:2017-12-15 06:40:45
【问题描述】:

我有一个输入文件“test.txt”,如下 -

host = abc.com host = xyz.com
db-host = abc.com db-host = xyz.com

每一行中,空格前的值是旧值,需要在名为“test”的文件夹中递归替换为空格后的新值

“sed”在 100 个文件中动态替换字符串。

是否有一种技巧或替代方法可以让我获得文件更改的报告,例如文件的绝对路径和更改的确切行?

PS - 我了解 sed 或流编辑器不支持开箱即用的此功能。我不想使用版本控制,因为这对这项任务来说太过分了。

【问题讨论】:

  • 使用像 git 这样的东西我不认为是矫枉过正。它设置起来既快速又容易,并且“占地面积”很小。只需运行“git init”就可以了。这也正是您所需要的。
  • 我需要使用 shell 脚本来完成这个任务。我只卡在搜索和替换功能。
  • 您需要数据,即 key=latest_value 在同一文件或不同文件中?
  • 我把这个问题作为参考,因为这个问题看起来像我的要求

标签: bash shell awk sed


【解决方案1】:

您可以使用perl 轻松实现此目的:

find -type f -iname '*.txt' -exec perl -i -lape 'if (/.+\s=\s.+\s.+\s=\s.+/) {s/.+\s=\s.+\s(.+\s=\s.+)/\1/; push (@lines, $_);} END {if (@lines) {print STDOUT "\n" . $ARGV . ":"; foreach (@lines){print "$_";}}}' {} \;

细分:

find -type f -iname '*.txt'在当前目录和子目录中查找文件名以.txt结尾的文件

-exec 对找到的每个文件运行以下命令

perl -i -lape根据以下perl脚本就地编辑文件。

if (/.+\s=\s.+\s.+\s=\s.+/) 如果该行与您提供的模式匹配:xxx = xxx xxx = xxx 其中x 是任何字符

{s/.+\s=\s.+\s(.+\s=\s.+)/\1/;搜索和替换,只保留该行的第二部分

push (@lines, $_);}将编辑后的行添加到数组中

END 处理完文件中的所有行后,执行以下操作

if (@lines) 仅在文件中有任何修改的行时才这样做

{print STDOUT "\n" . $ARGV . ":"; 打印一个空行,然后是文件名,后跟一个分号

foreach (@lines){print "$_";}}} 打印该文件中修改的每一行

{} \; 这是find 结果的占位符

【讨论】:

    猜你喜欢
    • 2017-12-04
    • 1970-01-01
    • 2011-02-17
    • 2010-09-10
    • 2018-12-22
    • 2020-07-23
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多