2016-11-08 2 views
0

Ich benutze unten Befehl, um eine Zeichenfolge basierend auf Trennzeichen zu schneiden. Aber ich möchte, dass die Ausgabe zusammen mit dem Trennzeichen gedruckt wird.Unix: Schneidet eine Zeichenkette mit Trennzeichen

Beispiel string: test_file.txt

Befehl:

echo "test_file.txt" | cut -sd_ -f1 

Stromausgang: Test

Erwartete Ausgabe: test_

EDIT: Ich schneide bin mit - sd, um null zu melden, wenn die Zeichenfolge das Trennzeichen nicht enthält. Wenn also der Begrenzer nicht vorhanden ist, sollte ich auch als Null ausgegeben werden.

Antwort

2

Wenn Sie BASH verwenden, dann ist es kein externes Tool benötigt:

s='test_file.txt' 
[[ $s == *_* ]] && echo "${s%%_*}"_ 

test_ 

Oder mit sed:

sed -n 's/_.*/_/p' <<< "$s" 

test_ 

Oder awk mit:

awk -F_ 'NF>1{print $1 FS}' <<< "$s" 

test_ 
+0

Vielen Dank für die schnelle Lösung .. Ich benutze sd in Schnittbefehl, so dass es null meldet, wenn kein Trennzeichen vorhanden ist. Kann das auch durch obige Befehle gemacht werden? Für z.B. Wenn ich testfile.txt verwende, sollte ich die Ausgabe als Null ausgeben, da das Trennzeichen nicht vorhanden ist. –

+0

Ja, alle Optionen in meiner bearbeiteten Antwort werden dafür sorgen. – anubhava

+1

Vielen Dank :) Prost –

0

Sie können dies nicht mit cut, aber Sie können es tun, mit sed:

$ echo "test_file.txt" | sed 's/\([^_]*_\).*$/\1/' 
test_ 

Wenn Sie wollen nichts überhaupt gedruckt werden, wenn es keine _ ist, der einfachste Ansatz ist wahrscheinlich Unkraut aus diesen Linien getrennt,

$ echo "test_file.txt" | sed '/^[^_]*$/d; s/\([^_]*_\).*$/\1/' 
+0

Vielen Dank für die schnelle Lösung .. Ich benutze sd in Schnittbefehl, so dass es Null meldet, wenn kein Trennzeichen vorhanden ist. Kann das auch durch sed geschehen? Für z.B. Wenn ich testfile.txt verwende, sollte ich die Ausgabe als Null ausgeben, da das Trennzeichen nicht vorhanden ist. –

+0

Mein ursprünglicher Befehl würde Zeilen ohne _ _ unverändert lassen; Ich habe eine weitere Option hinzugefügt, die sich so verhält, wie Sie es wünschen. – zwol

+0

Vielen Dank :) –

0
echo "test_file.txt" |grep -oP '^.*?_' 
test_ 

Dies wird bis zum ersten Begrenzer (_) einschließlich Begrenzer alles von Anfang der Zeile drucken.

+0

Vielen Dank :) –

Verwandte Themen