Wie kann ich unter Linux Text vor einem Trennzeichen löschen?


16

Ich muss Text aus einer Zeile vor dem Trennzeichen löschen.

Beispielsweise:

(123434): hello::{apple,orange,mango}.

Ich muss zuerst den Text löschen :. dh (123434).

Gibt es unter Linux einen Befehl, um diese Aufgabe auszuführen?


Vielleicht möchten Sie nachsehen sedoderawk
Paul

Ist dieser Text Teil einer Datei oder Teil einer Bash-Variablen?
Bernhard

Es ist Teil der Datei.
User80538

Antworten:


14

Dieser sedBefehl sollte den Trick machen. Der folgende Befehl überschreibt die Datei:

sed -i 's/^[^:]*:/:/' file

Entfernen Sie die Markierung, um nur die Ausgabe zu drucken -i. Entfernen Sie das -iFlag, und leiten Sie die Ausgabe um, um die Ausgabe in einer neuen Datei abzulegen:

sed 's/^[^:]*:/:/' file > new_file

Die Linie hat die Magie ... die Ausgabe in der Datei selbst ersetzt ..
user80538

Wenn ich zwei Dateien mit SDIFF vergleiche, nachdem ich den Text aus beiden Dateien entfernt habe, zeigt mir der Unterschied den entfernten Text für mich. Dieser Befehl überschreibt die Datei oder zeigt nur die Ausgabe.
User80538

Es hat funktioniert. Kann ich 'Hallo' und {Apfel, Orange, Mango} aus meinem Beispiel extrahieren, indem ich einfache Änderungen im obigen Befehl vornehme?
User80538

@ user80538, Es ist schwer zu sagen, was Sie wollen, wenn Sie in diesem Kontext extrahieren sagen . Ist dies Teil eines größeren Shell-Skripts? Möglicherweise möchten Sie eine neue Frage mit den Details des größeren Problems stellen, das Sie lösen möchten.
drs

Es ist nur ein einfacher Vergleich zweier Dateien mit denselben Daten, es muss jedoch nur festgestellt werden, wo sich die Daten in zwei Dateien unterscheiden. Ich muss jeden einzelnen Abschnitt in der Zeile überprüfen. Die Daten in den einzelnen Abschnitten können durcheinander geraten. wie {Apfel, Orange, Mango} kann {Apfel, Mango, Orange} sein.
User80538

14

Sie können verwenden cut:

echo '(123434): hello::{apple,orange,mango}.' | cut -d: -f2-

5

Sie können dies mit einer recht einfachen Bash- Anweisung tun :

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

Dies wird gedruckt : hello::{apple,orange,mango}.. Sie können Präfixe und Suffixe auf ähnliche Weise schneiden. Außerdem können Präfix- und Suffixdefinitionen Platzhalter enthalten.

Präfix ausschneiden - bis zum ersten übereinstimmenden Präfix-Platzhalter: ${variable#prefix}

Präfix ausschneiden - bis zum letzten übereinstimmenden Präfix-Platzhalter: ${variable##prefix}

Suffix ausschneiden - bis zur ersten Übereinstimmung mit Suffix-Platzhaltern: ${variable%suffix}

Suffix ausschneiden - bis zur letzten Übereinstimmung mit Suffix-Platzhaltern: ${variable%%suffix}

Es mag auf den ersten Blick unklar aussehen, siehe folgendes Beispiel:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

Im letzten Beispiel stimmt das Muster nicht überein, daher wird nichts abgeschnitten.


Es wäre robuster zu bedienen echo ${mytext#*:}:. Damit werden Zeilen wie (123)(434): hello::{apple,orange,mango}.und richtig behandelt 123434: hello::{apple,orange,mango}.
drs

Gibt es eine Möglichkeit der Befehl echo $ {mytext %% B *} zu erhalten Text nach B. in Ihrem Beispiel zu ändern
user80538

@ user80538 ja, schneide einfach den Text vor B einschließlich aus ;-), dh: $ {mytext # * B} für Text nach dem ersten B und $ {mytext ## * B} für Text nach dem zweiten B.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.