Sed: удалить все символы до двойного да sh, включая двойной тире - PullRequest
1 голос
/ 23 января 2020

У меня есть список имен файлов, которые имеют двойные черты:

New York--1984 and counting.txt
Timeless Wonders--Silver-Guardians.txt
Project Blue Gale--Hills of Green.txt

Мне нужно удалить двойные черты и все символы перед двойным да sh:

1984 and counting.txt
Silver-Guardians.txt
Hills of Green.txt

Вот код режима с использованием SED:

for f in *; do mv "$f" "$(sed 's/[^\--]*--//')"; done

RE ошибка: недопустимый диапазон символов

Если я изменю его, то он будет искать только один da sh , оно работает. Так как же я могу найти двойное значение da sh? Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 23 января 2020

Это может сработать для вас (параллельно GNU):

parallel --dryrun mv {} {= s/.*?--// =} ::: *.txt

Запустите команду в каталоге с исходными файлами и проверьте вывод. Если все проверено, удалите параметр --dryrun и запустите снова.

Альтернативное решение с использованием GNU sed:

ls *.txt | sed -E 'h;s/--/\n/;H;g;s/(.*)\n.*\n(.*)/mv -v "\1" "\2"/e'

NB Снимите флаг замены e, если хотите проверить прежде чем бежать по-настоящему.

2 голосов
/ 23 января 2020

Ошибка связана с тем, что ваш шаблон [^\--] определяет диапазон между \ (de c. 92) и - (de c. 45), что неверно.

Я предлагаю использовать

for f in *; do mv "$f" "$(sed 's/^[^-]*--//' <<< "$f")"; done

Команда sed 's/^[^-]*--//' удалит все 0 или более символов, кроме -, от начала строки до подстроки --.

Или вы можете использовать расширение параметра, ${f#*--} (как , обозначенное @ tripleee ). Он удалит 0 или более символов из начала строки как можно меньше (#*) до первого --.

См. online demo :

s="New York--1984 and counting.txt"
echo "${s#*--}";
sed 's/^[^-]*--//' <<< "$s"

Выход:

1984 and counting.txt
1984 and counting.txt
1 голос
/ 23 января 2020

Вы можете сделать это с помощью инструмента rename (Perl, а не util- linux one):

$ rename -n 's/.*?--//' *.txt
'New York--1984 and counting.txt' would be renamed to '1984 and counting.txt'
'Project Blue Gale--Hills of Green.txt' would be renamed to 'Hills of Green.txt'
'Timeless Wonders--Silver-Guardians.txt' would be renamed to 'Silver-Guardians.txt'

Удаление -n на самом деле выполняет переименование. .*?-- - это регулярное выражение, которое не жадно сопоставляет все до первого появления --.

...