我提前道歉,如果这属于SuperUser,我总是很难辨别这些脚本在bash问题中是否更好地放在这里或那里。目前我知道如何在多个文件中查找和替换字符串,以及如何在搜索解决此问题的解决方案中逐步查找和替换单个文件中的字符串,但如何将它们组合在一起使我无法理解。
以下是解释:
这就是我想要做的事情:
查找
MessageKey ab.cdefghi
替换:
MessageKey xx.aaa0001
MessageKey xx.aaa0002
...
MessageKey xx.aaa0010
etc.
每次到达新文件时递增1。
澄清:
答案 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指出我正确的方向。