Есть строка:
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