![](/img/trans.png)
[英]find and replace string (regex) across multiple files in linux using sed
[英]Find and Replace Incrementally Across Multiple Files - Bash
如果這屬於SuperUser,我會先道歉,我總是很難辨別bash問題中的這些腳本是放置在此處還是放置在此處。 目前,我知道如何查找和替換多個文件中的字符串,以及如何通過搜索此問題的解決方案來逐步查找和替換單個文件中的字符串,但是如何組合它們卻使我難以理解。
解釋如下:
這是我想做的:
找:
MessageKey ab.cdefghi
更換:
MessageKey xx.aaa0001 MessageKey xx.aaa0002 ... MessageKey xx.aaa0010 etc.
每次獲取新文件時,增量為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腳本。
@ 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 =:(或者我可以選擇在地圖文件中查找並用空格替換all,但是前者似乎更容易。
無論如何,最后還是成功了! 感謝卡爾為我指出正確的方向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.