Bitte beachten Sie diesen Ausschnitt:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* //p')
Ich möchte das letzte Wort in eine Variable einfügen, wenn eine Musterbedingung für Zeilen in einer beliebigen Textdatei übereinstimmt
Mein Problem ist, dass die Variable X
am Ende CR oder LF oder CRLF hat, abhängig von der Quelldatei, die ich entfernen möchte, da dies den späteren Betrieb beeinträchtigt, den ich beabsichtige.
Ich habe sogar so etwas versucht wie:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* \([A-Za-z]\+\)/\1/p')
Daher wird erwartet, dass die sed
Ausgabe begrenzt wird, [A-Za-z]+
aber es gibt immer noch diese störenden Bytes innerhalb der X-Variablen.
Wie kann ich es loswerden, ohne Sehen , zu viel Code , welche Bytes am Ende sind mit xxd
dann cut
es und ähnliche Komplikationen?
X
CR
, aber es wird eine gebenLF
. Es fiel mir schwer zu verstehen, was Sie von der Frage wollen, hoffentlich macht meine Bearbeitung, was Sie wollen.grep/sed
stattdessen mit einer Lösung ansprichtawk
(was ich nicht verstehe), und wenn nicht, werde ich es verwenden. DankeDas
``
oder$()
entfernt die neue Zeile vom Ende, aber um dies programmgesteuert zu tun, verwenden Sietr
.Dadurch werden der Wagenrücklauf und / oder die neue Zeile aus der Zeichenfolge entfernt.
Das Problem könnte sein, wie Sie das Ergebnis dann ausgeben .
echo
Fügt beispielsweise standardmäßig eine neue Zeile hinzu. Möglicherweise möchten Sieecho -n
oder verwendenprintf
.quelle
-m1
wird sichergestellt, dass nur eine Zeilenausgabe vorhanden ist, bei der der Wagenrücklauf aller Wahrscheinlichkeit nach am Ende erfolgen würde.tr
... interessant, funktioniert sowohl mit LF- als auch mit CRLF-Dateien. Ich würde\010\013
aus irgendeinem Grund denken und\f\r
funktioniert auch richtig. Über das Ergebnis: Ich setze die Ausgabe nicht in eine Variable, sondern als Variable, die$()
in einem Muster für diegrep
Übereinstimmung eingeschlossen istsome pipe | grep -o " $(...) "
. Vielen Dank für KommentareIch bevorzuge diesen Weg
quelle
Das funktioniert bei mir:
quelle
Warum nicht einfach
sed
die[\r\f]
Bereinigung durchführen lassen:Bei Ihrem zweiten Ansatz fehlt ein endgültiger regulärer Ausdruck, um die nachfolgende CR zu erfassen
\r
.quelle
Die normale Version von grep (einschließlich grep -P) gibt immer einen Zeilenvorschub mit seiner Übereinstimmung aus. Wenn Sie also nur ein Ergebnis haben (oder nur den endgültig hinzugefügten Zeilenvorschub entfernen möchten), reicht es aus, einfach das endgültige Zeichen zu entfernen der Ausgabe, die Sie tun können, indem Sie es durchleiten
head -c-1
.quelle