
Ich möchte die Zeilen, die einem Muster aus einer Datei entsprechen, durch die Zeilen in der richtigen Reihenfolge aus einer anderen Datei ersetzen, zum Beispiel:
Datei1.txt:
aaaaaa
bbbbbb
!! 1234
!! 4567
ccccc
ddddd
!! 1111
Wir möchten die Zeilen, die mit !! beginnen, durch die Zeilen dieser Datei ersetzen:
Datei2.txt:
first line
second line
third line
Das Ergebnis sollte also sein:
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
Antwort1
Einfach geht mitawk
awk '
/^!!/{ #for line stared with `!!`
getline <"file2.txt" #read 1 line from outer file into $0
}
1 #alias for `print $0`
' file1.txt
Andere Version
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
Antwort2
Mit GNU sed
, ähnlich wieawk+getline
$ sed -e '/^!!/{R file2.txt' -e 'd}' file1.txt
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
R
würde eine Zeile nach der anderen geben- Reihenfolge ist wichtig, erst
R
und dannd
Mitperl
$ < file2.txt perl -pe '$_ = <STDIN> if /^!!/' file1.txt
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
- Übergeben Sie die Datei mit den ersetzten Zeilen als Standardeingabe, damit wir sie mit
<STDIN>
dem Dateihandle lesen können - Wenn eine übereinstimmende Zeile gefunden wird, ersetzen Sie diese
$_
durch eine Zeile aus der Standardeingabe.