我有一個要執行替換的文件列表和相應的行號:
s/LOG.error/LOG.warn
還有其他地方可能會發生這種情況,並且不想打擾這些線路。我如何使用 find 和 sed 來做到這一點?
該文件的格式為:
FooBar.java 125
FooBar.java 180
FooBar2.java 128
這是我在尋找方法時發現的:
cat filenames.txt | xargs sed -i '<get-line-number-here>s/LOG.error/LOG.warn' <get-file-name-here>
答案1
您需要按目標檔案將檔案拆分為多個分割區,並對sed -i
每個檔案單獨執行。假設您有按檔案名稱並按升序分組的檔案名稱和行號,您可以執行以下操作
awk '$1 != prev { if (prev) print "\047 " prev;
prev=$1;
printf "sed -i \047" }
{ print $2 "s/LOG\\.error/LOG.warn/" }
END { if (prev) print "\047 " prev }' filenames.txt | sh
這是一個快速而骯髒的駭客行為,如果第一列中的檔案名稱不是單一標記,它將以有趣且可能危險的方式進行破壞。
我們基本上將您的文字檔案重構為一系列sed
腳本。所以你的例子將會變成
sed -i '125s/LOG\.error/LOG.warn
180s/LOG\.error/LOG.warn/
' FooBar.java
sed -i '128s/LOG\.error/LOG.warn/
' FooBar2.java
您會注意到這是一個腳本,其中每個文件都sh
包含一個腳本。sed
如果您使用的是 *BSD 平台(包括 Mac OS),則需要更改Awk 中的內容,sed -i
以便正確嵌入單引號而不干擾周圍的 shell 引用(以便整行變為(sic))。sed -i ''
"sed -i \047\047"
printf "sed -i \047\047 \047" }