gpt4 book ai didi

linux - 跨多个文件增量查找和替换 - Bash

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:13 25 4
gpt4 key购买 nike

如果这属于 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。

最佳答案

我会通过创建从旧 key 到新 key 的映射并将其转储到临时文件中来解决这个问题。

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 脚本。

关于linux - 跨多个文件增量查找和替换 - Bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25169423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com