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\/\2
Jede ü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 sed
müssen ,-E
sed -E 's,([[:digit:]]+).*,&/\1,' file
Der sed
Ersetzungsausdruck 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