替換多個文件中的一行

替換多個文件中的一行

我有一個要執行替換的文件列表和相應的行號:

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" }

相關內容