多个文件中的增量查找和替换 - Bash

时间:2014-08-06 20:17:33

标签: linux bash replace find increment

我提前道歉,如果这属于SuperUser,我总是很难辨别这些脚本在bash问题中是否更好地放在这里或那里。目前我知道如何在多个文件中查找和替换字符串,以及如何在搜索解决此问题的解决方案中逐步查找和替换单个文件中的字符串,但如何将它们组合在一起使我无法理解。

以下是解释:

  • 我有几百个文件,每个文件有两个:数据文件(.data)和消息文件(data.ms)。
  • 这些文件通过每组两个唯一的键值链接,如下所示: ab.cdefghi

这就是我想要做的事情:

  • 逐步执行每个.data文件并执行以下操作:
  • 查找

    MessageKey ab.cdefghi
    
  • 替换:

    MessageKey xx.aaa0001
    MessageKey xx.aaa0002
    ...
    MessageKey xx.aaa0010
    etc.
    

    每次到达新文件时递增1。

澄清:

  • 作为参考,只有一个" MessageKey"在每个文件中。
  • 配对文件具有相同的名称,只有它们的扩展名不同,所以我可以简单地遍历所有.data文件,然后是所有.data.ms文件,并在两者上使用任何增量解决方案,它们匹配正常,不需要任何太过花哨的东西来编辑两个文件串联或任何东西。
  • 对于所有意图和目的,在每个MessageKey是垃圾之后当前出现在线上的任何意图和目的,我完全抛弃它并用xx.aaa替换####
  • 字符串长度很重要,所以我需要xx.aa0009,xx.aaa0010而不是xx.aa0009,xx.aa00010
  • 我正在使用cygwin。

2 个答案:

答案 0 :(得分:1)

我会通过创建从旧密钥到新密钥的映射并将其转储到临时文件来实现此目的。

grep MessageKey *.data \
  | sort -u \
  | awk '{ printf("%s:xx.aaa%04d\n", $1, ++i); }' \
  > /tmp/key_mapping

从那里开始,我确认在使用sed将映射应用于文件之前,文件看起来正确。

cat /tmp/key_mapping \
  | while read old new; do
      sed -i -e "s:MessageKey $old:MessageKey $new:" * \
    done

这可能对你有用,但它既不优雅也不高效。如果我只打算运行一次,我就会这样做。如果我要经常运行这个并且效率很重要,我可能会写一个快速的python脚本。

答案 1 :(得分:0)

@ Carl.Anderson让我开始走上正轨,经过一番调整后,我最终实现了他的解决方案,但进行了一些语法调整。

首先,只有当您的所有文件都位于同一目录中时,此解决方案才有效。我确信任何对UNIX有更多经验的人都可以修改这个以递归方式工作,但是这里有:

首先我跑了

-hr "MessageKey" . | sort -u | awk '{ printf("%s:xx.aaa%04d\n", $2, ++i); }' > MessageKey

此命令用于创建名为" MessageKey的查找和替换地图文件。"

其内容如下:

In.Rtilyd1:aa.xxx0087
In.Rzueei1:aa.xxx0088
In.Sfricf1:aa.xxx0089
In.Slooac1:aa.xxx0090
etc...

然后我跑了:

MessageKey | while IFS=: read old new; do sed -i -e "s/MessageKey $old/MessageKey $new/" *Data ; done

我不得不使用IFS = :(或者我可以在地图文件中找到并替换所有:带有空格,但前者看起来更容易。

无论如何,这最终有效!感谢Carl指出我正确的方向。