Ich bin ein neuer Linux-Benutzer und ich habe immer noch nicht herausgefunden, wie man es benutzt, löste das Problem auf sehr hässliche Weise, aber ich bin sicher, dass es durch eine clevere Verwendung von sed
oder awk
gelöst werden kann. Problem ist ein wenig schwer zu erklären, aber es geht darum, wie zwei Textdateien, die durch bestimmte Regeln formatiert sind, zu überlappen.Überlappung von zwei Dateien in Linux oder entsprechenden Ersatz von Zeilen aus Datei1 mit Zeilen aus Datei2
Problem 1:
Regeln: file1 hat einige Zeilen, die gleich der Zeichenfolge „custom
“, diese Linien durch die Linien ersetzt werden, die jeweils in file2
existieren, so erstmals „custom
“ tritt in file1
, erste Zeile von file2
wird statt Linie gesetzt werden, die „custom
“ in file2, zum zweiten Mal „custom
“ in file1 kommt es durch die zweite Linie von file2 usw. auch Anzahl der Vorkommen von „custom
“ Linien ersetzt braucht werden mußten in file1
entspricht der Anzahl der Zeilen in file2
.
Beispiel:
File1:
line1
line2
custom
line4
custom
line6
File2:
line3
line5
output:
line1
line2
line3
line4
line5
line6
Eine Möglichkeit, dieses zu lösen i s vielleicht nach ersten Auftreten von custom
suchen, ersetzen Sie es durch die erste Zeile in file2
, löschen Sie die erste Zeile von file2
, suchen Sie nach dem nächsten Auftreten von benutzerdefinierten, nehmen Sie die erste Zeile in file2
, löschen Sie es und so weiter. Ich bin mir sicher, dass viel besser mit sed/grep/awk existiert.
Problem 2:
Benutzer des Codes muss tatsächlich file2 angeben, wie ich ihm sagen, vielleicht, wenn das Problem wie folgt formuliert wurde, es wäre einfacher zu lösen sein:
Dies sind die Regeln: Sowohl Datei1 als auch Datei2 haben jetzt die gleiche Anzahl von Zeilen. Einige der Zeilen in Datei1 entsprechen der Zeichenfolge "custom" wie im vorherigen Problem. Datei2 enthält leere Zeilen an Stellen, an denen Zeilen in Datei1 nicht mit "Benutzerdefiniert" übereinstimmen. Daher möchte ich Datei2 über Datei1 einfügen und nur Zeilen mit "Benutzerdefiniert" überschreiben.
Datei 1 wie folgt aussieht:
line1
custom
line3
custom
line5
Datei 2:
/n
line2
/n
line4
/n
/n steht für leere Zeile, ausgegeben wird
line1
line2
line3
line4
line5
Auch würde ich gerne Ausgang der Lösung, um Datei1 zu überschreiben (Ich denke, ich kann es tun, indem solution >> file1
)
Ich möchte Lösungen für beide Probleme und Erklärung, was die Befehle, die Sie verwendeten, tatsächlich getan haben.
Ich habe eigentlich nur 1-3 Zeilen in der Datei1 für die aktuelle Version des Codes, also löste ich das Problem mit vielen von if-else Szenarien durch Überschrift und tailing Zeilen in Datei2, aber ich bin sicher, etwas eleganter ist möglich.
BONUS Frage:
ich zunächst Inhalt der Zeilen in file1 als separate Variablen ($line1
, $line2
etc.) und fast löste das Problem mit awk
, gespeichert, aber es wollte nicht $var
akzeptieren, weil die die ''
zitiert, und es hat auch nicht mit ""
zitiert. Ich sah, dass sed kann mächtige Dinge tun, aber kann es mit Muster in String Variable gespeichert ausgeführt werden? Ich habe versucht, sed
mit ""
und $var
funktioniert, aber wird es immer funktionieren? Ich habe das gleiche mit Awk versucht und es ist kaputt gegangen.
Bitte zeigen Sie, was Sie – Vasfed
versucht haben ** und gelöst fast das Problem mit awk **: Können Sie zeigen Sie Ihre Lösung in Frage – anubhava
Sollte das zweite Beispiel nicht zwei 'line3' Linien haben? – 123