Разделить строку по нескольким разделителям в bash

Разделить строку по нескольким разделителям в bash

Есть строка:

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

Я хочу разделить его ., ;удалив префикс перед именем файла, чтобы он выглядел так:

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

Есть идеи?

решение1

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

Сначала удаляется самая короткая подстрока до .начала, а затем можно приступать к ;работе с полученной строкой.

решение2

Принимая"в баше"буквально, вы могли бы сделать что-то вроде этого.

  • разбить строку на массив, разделенный точками с запятой

  • удалить префикс поэлементно и сохранить результат в строке, разделенной первым символом IFS

  • глобально добавить пробелы после разделителей

ПРИМЕЧАНИЕ: вы можете сохранить текущие настройки IFS, чтобы впоследствии их можно было восстановить.

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//;/; }"

джинвинг

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

решение3

Или, с sed...

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

Прохождение

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

Найдите любой подэлемент, который начинается либо в начале строки, ^либо |с ;(точки с запятой и пробела) и за которым следует [^\.]+\.непрерывная серия, которая не содержит литерала ., но котораяделаетзаканчиваются буквальным.

Затем замените все это на то, \1что является группой захвата(^|; )

Выход

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

Связанный контент