Text-Processing
按順序將與模式匹配的行替換為另一個文件中的行
我想從另一個文件的行中替換與一個文件中的模式匹配的行,例如,給定:
文件 1.txt:
aaaaaa bbbbbb !! 1234 !! 4567 ccccc ddddd !! 1111
我們喜歡替換以 !! 開頭的行 使用此文件的行:
文件 2.txt:
first line second line third line
所以結果應該是:
aaaaaa bbbbbb first line second line ccccc ddddd third line
用awk可以輕鬆完成
awk ' /^!!/{ #for line stared with `!!` getline <"file2.txt" #read 1 line from outer file into $0 } 1 #alias for `print $0` ' file1.txt
其他版本
awk ' NR == FNR{ #for lines in first file S[NR] = $0 #put line in array `S` with row number as index next #starts script from the beginning } /^!!/{ #for line stared with `!!` $0=S[++count] #replace line by corresponded array element } 1 #alias for `print $0` ' file2.txt file1.txt
,
GNU sed
類似於awk+getline
$ sed -e '/^!!/{R file2.txt' -e 'd}' file1.txt aaaaaa bbbbbb first line second line ccccc ddddd third line
R
一次只給一行- 順序很重要,先後
R
後d
和
perl
$ < file2.txt perl -pe '$_ = <STDIN> if /^!!/' file1.txt aaaaaa bbbbbb first line second line ccccc ddddd third line
- 將帶有替換行的文件作為標準輸入傳遞,以便我們可以使用
<STDIN>
文件句柄讀取它- 如果找到匹配行,則替換
$_
為標準輸入中的一行