我有一個文件,其中有(許多)我想要替換的字串,所以我考慮使用一個簡單的命令,例如:
sed 's/string1/string2/g' file1 > out
但是,字串太多,無法手動重複。所以我列出了所有要替換的字串,每個字串在一行中,並將其命名為文件 A。
有沒有辦法做類似的事情:
sed 's/line i of file A/line i of file B/g' file1 > out
對於文件 A 的每一行?
答案1
建立一個將輸入字串和替換字串放在同一行的檔案會更容易(假設輸入字串和替換字串都不包含空格)。然後你可以做一些簡單的事情,例如:
while read n k; do sed -i "s/$n/$k/g" file1; done < fileA
編輯:
看到 Nykakin 的答案後,我意識到你可以對你結合他的建議和我的建議的兩個文件做同樣的事情:
paste fileA fileB | while read n k; do sed -i "s/$n/$k/g" file1; done
答案2
這基本上是您的第一個想法,但是將替換命令放入文件中,因此它們更易於管理:
tmpfile=/tmp/Asasuser.$$ 執行3<文件A 執行4<文件B while read –r astring <&3 做 讀取 –r bstring <&4 echo "s/$astring/$bstring/" >> "$tmpfile" 完畢 執行 3<&- 4<&- sed –f "$tmpfile" file1 > 輸出 rm –f "$tmpfile"
這假設fileA
和fileB
具有相同的行數(並且該行數大於零)並且它們都沒有任何未轉義的/
字元。
答案3
我們可以產生我們需要的命令。假設帶有列表的檔案稱為 lista 和 listb。然後我們可以使用:
$ for i in $(paste lista listb -d/); do echo -n "-e 's/$i/g' "; done
為 sed 產生選項。現在我們可以將它與 eval 一起使用。假設我們的檔案名稱為 test。我們用:
$ eval "sed" $(for i in $(paste lista listb -d/); do echo -n "-e 's/$i/g' "; done) "test"
答案4
paste -d : fileA fileB | sed 's/\([^:]*\):\([^:]*\)/s%\1%\2%/' > sed.script
sed -f sed.script SOURCE-FILE
SOURCE-FILE
可以是單一文件或多個文件。 fileA 和 fileB 中的文字不能包含冒號或百分號字符,但可以包含空白字符。