Ersetzen Sie Zeilen, die einem Muster entsprechen, der Reihe nach durch Zeilen aus einer anderen Datei.

Ersetzen Sie Zeilen, die einem Muster entsprechen, der Reihe nach durch Zeilen aus einer anderen Datei.

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
  • Rwürde eine Zeile nach der anderen geben
  • Reihenfolge ist wichtig, erst Rund 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.

verwandte Informationen