Kombinieren Sie 2 sed, ohne Änderungen in der Datei zu speichern

Kombinieren Sie 2 sed, ohne Änderungen in der Datei zu speichern

Ist es überhaupt möglich, Sonderzeichen wie \ aus einer Datei zu löschen, während man mit sed und einer Kommentarzeile, die aus „Word“ besteht, die Datei liest und darin sucht. Anschließend wird gespeichert, aber \ bleibt an der Stelle?

Ich meine, ich habe eine Datei mit Firmennamen (2 Wörter) und dazwischen können einige Zeichen sein und in der Originaldatei wurde für diese Symbole Zeichen-Escapezeichen (reguläre Ausdrücke) verwendet. Zum Beispiel

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\_M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\.M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

Ich ersetze \ durch nichts und kommentiere, aber ich möchte auch mit \ speichern, wie es vorher war. Die Ausgabe, die ich gerne hätte:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

Mein Skript ist:

sed -E -e 's/\\//g' -i -e '/ITALY.*Delta M/s/^/#/' file.txt

Aber es wird ohne \ gespeichert. Ja, ich weiß, ich kann nicht löschen und nur nach Red\\\\ Park suchen. Wenn ich jedoch 20 Namen habe, möchte ich nicht für jeden Firmennamen, der aus 2-3 Wörtern besteht, \\\\ eingeben:) Oder haben Sie vielleicht eine andere Vorstellung, wie man es mit einem anderen Befehl macht, nicht mit sed? Ich bin für jeden Rat und jede Hilfe offen. Ist es möglich, das zu bekommen, was ich will? Vielen Dank!

Antwort1

Wenn ich Sie richtig verstehe, schauen wir mal, ob das bei Ihnen funktioniert:

sed -E -e 's/^(.*\w+)\\\\ /#\1\\\\ /' -e 's/\\\\.([^ ]*)$/\\\\ \1/ file

Ausgabe:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

Antwort2

Man sagt, Beharrlichkeit sei eine Tugend …

Ich gehe davon aus, dass alle beiden Firmennamen durch \\ein weiteres Zeichen getrennt sind und dass Länder immer groß geschrieben werden und alle Firmen mindestens einen Kleinbuchstaben enthalten, d. h. eine Firma kann keine Teilzeichenfolge eines Landes sein.

Eine awkLösung, wenn Ihre diese -i inplaceOption unterstützt; ich glaube, die meisten tun das

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\\' 'BEGIN{
    OFS="\\"}
    $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}
    NF>1{$NF=" "substr($NF,2)
    };1' file1
Output

#lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
lunar_static KKK_FRANCE_NUM "/^08.00.Green\\ Banana$/"

Lösungsweg

Sagen Sie awk, dass Sie die Änderungen vornehmen -i inplaceund Ihr Land und Ihr Unternehmen als Variablen übergeben sollen . Da Sie in Ihrer Datei -vein unbekanntes Trennzeichen haben, verwenden Sie es zwischen den beiden Teilen des Firmennamens\\.

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\' 'BEGIN{

Setzen Sie den Feldtrenner auf „break on“, \wodurch Sie 3 Felder erhalten, in denen \\auftritt, und setzen Sie dann

        OFS="\\"} 

um sie beim Drucken wieder einzufügen, wenn es eine Unterbrechung gab.

Wenn dies das erste Feld $1==countryist, handelt es sich um den ersten Teil der Übereinstimmung.

Überprüfen Sie für das Unternehmen, ob Sie die Felder aufgeteilt haben \und am Ende mehrere Felder übrig geblieben sind, NR>1und testen Sie sie dann je nach Bedarf entweder anhand der letzten beiden Felder oder des nicht aufgeteilten Felds.

Wenn wir eine Übereinstimmung haben, dann printf #(das ist Drucken ohne Zeilenumbruch)

        $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}

Wenn Sie mehr als ein Feld haben, NF>1teilen Sie es \\?zwischen Firmennamen auf und möchten sicherstellen, dass ?beim Drucken Leerzeichen vorhanden sind. Entfernen Sie daher das erste Zeichen des letzten Felds und ersetzen Sie es durch ein Leerzeichen.

    NF>1{$NF=" "substr($NF,2)

Und drucken

;1' file1

verwandte Informationen