Teilen Sie eine Zeichenfolge durch mehrere Trennzeichen in Bash

Teilen Sie eine Zeichenfolge durch mehrere Trennzeichen in Bash

Es gibt eine Zeichenfolge:

onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt

Ich möchte es aufteilen, indem .ich ;das Präfix vor dem Dateinamen entferne, sodass es folgendermaßen aussieht:

file.001.txt ; file.0.98.txt ; file.14.txt

Irgendwelche Ideen?

Antwort1

sed -e 's/[^.]*.//' -e 's/;[^.]*./; /g'

Dadurch wird zunächst die kürzeste Teilzeichenfolge bis .vom Anfang entfernt und anschließend kann ;mit der resultierenden Zeichenfolge verfahren werden.

Antwort2

Nehmen Sie die"in Bash"Sie könnten im wahrsten Sinne des Wortes so etwas tun.

  • Teilen Sie den String in ein Array auf, das durch Semikolons getrennt ist.

  • Entfernen Sie das Präfix elementweise und speichern Sie das Ergebnis in einer Zeichenfolge, getrennt durch das erste Zeichen von IFS

  • Leerzeichen hinter den Trennzeichen global wieder hinzufügen

HINWEIS: Möglicherweise möchten Sie die aktuelle Version speichern, IFSdamit Sie sie später wiederherstellen können.

IFS=";"
read -a arr <<< "onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt"
printf -v str "${arr[*]#*.}"
printf "%s\n" "${str//;/; }"

geben

file.001.txt ; file.0.98.txt ; file.14.txt

Antwort3

Oder mit sed...

s="onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt"
sed -E "s/(^|; )[^\.]+\./\1/g" <<<$s

Lösungsweg

(^|; )[^\.]+\.

Suchen Sie nach jedem Unterelement, das entweder am Zeilenanfang ^oder |mit ;(Semikolon und Leerzeichen) beginnt und auf das eine fortlaufende Reihe folgt, [^\.]+\.die kein Literal enthält ., abertutenden mit einem wörtlichen.

Ersetzen Sie dann alles durch \1das, was die Erfassungsgruppe ist(^|; )

Ausgabe

file.001.txt ; file.0.98.txt ; file.14.txt

verwandte Informationen