Suchen Sie nach einem Textabschnitt in einer Zeile und fügen Sie ihn dann einem anderen Teil derselben Zeile hinzu.

Suchen Sie nach einem Textabschnitt in einer Zeile und fügen Sie ihn dann einem anderen Teil derselben Zeile hinzu.

Ich habe das:

Issue #12345: some more text here https://some.domain/some/path

Ich möchte das Bit 12345 finden (das dynamisch ist, also über einen regulären Ausdruck) und es dann am Ende derselben Zeile hinzufügen. So:

Issue #12345: some more text here https://some.domain/some/path/12345

Wie kann ich das mit sed/awk erreichen?

PS: Ich habe mich umgesehen, aber die einzige ähnliche Frage war diese:Ersetzen eines Teils einer Zeichenfolge durch einen anderen Teil derselben Zeichenfolge...aber es fehlt das Regex-Bit.

Antwort1

Vorausgesetzt, Ihre Eingabe befindet sich in einer Datei test.txt, sollte der folgende Befehl funktionieren

sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g' test.txt

Wenn Sie nicht direkt aus einer Datei lesen,

input_source | sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g'

Ausgabe:

Issue #12345: some more text here https://some.domain/some/path/12345

Was der Befehl bewirkt:

^(.*)Beginnen Sie am Anfang der Datei und erfassen Sie alles bis zur nächsten Übereinstimmung. ([[:digit:]]{5})Die nächsten 5 Ziffern entsprechen der Übereinstimmung. (.*)$Erfassen Sie alles bis zum Ende der Datei. \1\2\3\/\2Jede übereinstimmende Gruppe wird nummeriert (in diesem Fall 1–3). Wir formatieren die Ausgabe, um den Originaltext (Übereinstimmungen 1–3), „/“ und dann die zweite Übereinstimmung zu erhalten.

Für zukünftige Referenzen wäre es ideal, wenn Sie Ihr Problem konkreter beschreiben könnten. Nehmen wir beispielsweise an, Sie suchen nach den ersten 5 Ziffern in einer Zeile und möchten diese Ziffern (mit einem vorangestellten Schrägstrich) am Ende der Zeile hinzufügen und dies für jede Zeile in der Eingabe durchführen lassen. Ich bin davon ausgegangen, dass Sie das gemeint haben. Wenn nicht, sollten Sie Ihre Frage aktualisieren, um sie spezifischer zu machen.

Vielleicht möchten Sie auch einige Ihrer Versuche auflisten, anstatt nur vorherige Fragen zu zitieren. Dies hilft uns auch, uns ein besseres Bild davon zu machen, was Sie versuchen zu tun.

Antwort2

sed 's,\([[:digit:]][[:digit:]]*\).*,&/\1,' file

oder, wenn Sie mit erweiterten regulären Ausdrücken in Mustern arbeiten sedmüssen ,-E

sed -E 's,([[:digit:]]+).*,&/\1,' file

Der sedErsetzungsausdruck findet die erste positive Ganzzahl (Ziffernfolge) in der Zeile und erfasst sie. Er gleicht auch den Rest der Zeile von diesem Punkt an bis zum Zeilenende ab. Der Ersetzungsteil des Ausdrucks ersetzt das übereinstimmende Bit der Zeile durch alles, was übereinstimmte ( &), gefolgt von einem Schrägstrich und der erfassten Ziffernfolge.

Ich verwende Kommas als Trennzeichen im Ausdruck, da der Ersetzungsteil einen Schrägstrich enthält, aber ich hätte den Befehl auch so schreiben können

sed -E 's/([[:digit:]]+).*/&\/\1/' file

Die obigen Befehle führen die Ersetzung auf allen Eingabezeilen aus. Um sie auf Zeilen zu beschränken, die nur mit der Zeichenfolge beginnen Issue #, verwenden Sie

sed -E '/^Issue #/s,([[:digit:]]+).*,&/\1,' file

Antwort3

Ich habe es mit der folgenden Methode gemacht

Befehl

i=`awk '{print $2}' file.txt| sed "s/^#//g"| sed "s/:$//g"`
awk -v i="$i" '{print $0"/"i}' filetxt

Ausgabe

Issue #12345: some more text here https://some.domain/some/path/12345

verwandte Informationen