我有兩個檔案。
第一個檔案在每一行中包含行號和文本。例如:
2 AAAA
4 BBBB
5 nnnn
此文本應替換第二個檔案中的行 - 根據第一列,即第二個檔案上的行號。
因此,如果最初第二個檔案是:
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
更改后,它將是
XXXXX
AAAA
XXXXX
BBBB
nnnn
XXXXX
我想使用 sed :
sed "$Ns/XXXXX/$A/" file > file-after-change
while$N是行號(取自第一個檔案),$A將是第一個檔案中的字串。
我如何首先將行號作為變數讀取,N然后將字串本身讀取為不同的變數(A)?
uj5u.com熱心網友回復:
您可以使用sed將第一個檔案轉換為sed腳本,然后將其傳遞給第二個sed實體。
sed 's%^\([0-9]*\) *\([^ ]*\)$%\1s/XXXXX/\2/' firstfile |
sed -f - secondfile
Linuxsed會欣然接受-f -;在其他一些平臺上,可能會嘗試-f /dev/stdin或只是將生成的腳本保存到臨時檔案中,并在完成后將其洗掉。
uj5u.com熱心網友回復:
或者,考慮使用awk.
awk 'FNR==NR { seen[$1]=$2; next } seen[FNR] { print seen[FNR]; next } 1' file1.txt file2.txt
uj5u.com熱心網友回復:
這是一個潛在的解決方案,可以“就地”編輯“second.txt”檔案,并且與您已經嘗試過的內容一致:
cat first.txt
2 AAAA
4 BBBB
5 nnnn
cat second.txt
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
# GNU sed
while read N A
do
sed -i "${N}s/XXXXX/${A}/" second.txt
done < first.txt
cat second.txt
XXXXX
AAAA
XXXXX
BBBB
nnnn
XXXXX
(macOS sed: while read N A; do sed -i '' "${N}s/XXXXX/${A}/" second.txt; done < first.txt)
uj5u.com熱心網友回復:
丑陋但有效(guide是帶有行號和替換的檔案,input是實際的輸入檔案):
eval "$(cat guide | sed '/^[0-9]\ */s!^\([0-9]\ \) *\(.*\)!\1s/.*/\2/!' | sed -z "s/\n/;/g;s/.*/sed '&'/")" < input
(我相信,需要 GNU sed。)
uj5u.com熱心網友回復:
這可能對您有用(GNU sed):
sed 's/\s\ /c/' file1 | sed -f - file2
將 file1 轉換為 sed 腳本并將其應用于 file2。
sed 腳本將 file2 中由 file1 中的行號參考的每一行更改為該行號之后的引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/428537.html
