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, IFS
damit 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 \1
das, was die Erfassungsgruppe ist(^|; )
Ausgabe
file.001.txt ; file.0.98.txt ; file.14.txt