簡體   English   中英

跨多個文件逐步查找和替換-Bash

[英]Find and Replace Incrementally Across Multiple Files - Bash

如果這屬於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。

我將通過創建從舊鍵到新鍵的映射並將其轉儲到臨時文件中來解決此問題。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM