2017-09-29 1 views
0

Ich versuche, alles nach einem specific_string in einer Pfadzeichenfolge in Bash zu entfernen. Ich habe versucht, sed bisher vergebens zu verwenden.Bash Entfernen jedes Auftreten nach dem ersten in der Zeichenfolge

variable="specific_string" 
input_string="/path/to/some/specific_string/specific_string.something/specific_string.something-else" 
output=$(sed 's/$variable//' $input_string) 

Output sollte besser "/path/to/some/specific_string/"

Wäre, wenn ich keine Befehle als sed solche verwenden hatte!

Antwort

2

Die Probleme

Es gibt viele Probleme

  • Variablen werden nicht in einfachen Anführungszeichen ausgewertet. 's/$variable//' wird als Zeichenkette behandelt werden, die nichtspecific_string enthalten

  • sed Text aus Dateien oder STDIN ändern können, aber nicht über die Parameter angegebenen Text. Mit sed 's/...//' $input_string wird der geöffnet und sein Inhalt gelesen, anstatt den Pfad selbst.

  • s/string// löscht nurstring, nicht die Worte danach.

Denken Sie auch daran, Ihre Variablen doppelt anzugeben. cmd $variable ist gefährlich, wenn die Variable Leerzeichen enthält. cmd "$variable" ist sicher.

Sed Lösung

output="$(sed "s/$variable.*/$variable/" <<< "$input_string")" 

GNU Grep Lösung

output="$(grep -Po "^.*?$variable" <<< "$input_string")" 

Reine Bash Lösung

output="${input_string%%$variable*}$variable" 
1

Wenn Sie alles löschen wollen nach „specific_string“ es entfernt das „/“ auch wie sie mit dem folgenden Beispiel:

output=$(echo $input_string|sed "s/${variable}.*$/${variable}/") 
1

versuchen mit einfachen sed:

variable="specific_string" 
input_string="/path/to/some/specific_string/specific_string.something/specific_string.something-else" 
output=$(echo "$input_string" | sed "s/\(.*$variable\/\).*/\1/") 

Die Ausgabe der variablen Ausgabe ist wie folgt.

echo $output 
/path/to/some/specific_string/ 
Verwandte Themen