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

В ответах поясняется, что -iне является стандартным, в одном из них даже поясняется использование вместо него временного файла, но игнорируется главный вопрос, как это сделать для нескольких операторов.

Конечно, вы можете перенаправить каждое выражение и скопировать обратно после каждого выражения. Но вам все равно не нужны отдельные вызовы sedдля каждого оператора, вы можете указать несколько скриптов с несколькими-e:

sed -e '/test1/s/^/#SB#/g' -e '/test2/s/^/#SB#/g' -e' /test4/s/^/#SB#/g' file1

Или вы можете объединить sedкоманды с;:

sed '/test1/s/^/#SB#/g;/test2/s/^/#SB#/g;/test4/s/^/#SB#/g' file1

В вашем примере вы даже можете найти регулярное выражение для объединения замен:

sed '/test[124]/s/^/#SB#/g' file1

Ответ после того, как мы улучшим скрипт :Флаг gдля команд sозначает «заменить все вхождения в строке», но поскольку каждая строка имеет только одно начало (^), вы можете опустить это, так что ваша последняя работа

sed '/test[124]/s/^/#SB#/' file1 > /tmp/file1 && mv /tmp/file1 file1

(&&используется, чтобы избежать уничтожения файла в случае сбоя sed)

3
23.11.2021, 14:49
2 ответа

Как объясняется в комментарии, это работает в Linux, но не по умолчанию в MacOS.

touch $'file_\r_name'

ls -l --quoting-style=c file_*
-rw-r--r-- 1 hl hauke 0 23. Nov 17:02 "file_\r_name"

find. -name $'*\r*' -exec rename -nv $'\r' '' {} + 2>/dev/null | cat -v
`./file_^M_name' -> `./file__name'

-nvпереводит renameв пробный подробный режим.

cat -vявляется (более или менее )необходимым, потому что \rделает вывод довольно странным (, потому что часть после \rперезаписывает часть до ).

1
23.11.2021, 15:10

Для массового -переименования (или массового -копирования )файловzmvвам в помощь.

autoload zmv
zmv -W $'**/*\r' '**/*'

Пояснения:

  • zmvпереименовывает файлы, соответствующие данному шаблону подстановочных знаков (здесь$'**/*\r')в заданное выражение замены (здесь**/*).
  • Параметр -Wпозволяет использовать подстановочные знаки в выражении замены.
  • Синтаксис$'…'поддерживает выражения обратной косой черты, такие как \rдля возврата каретки.
  • **/*соответствует каждому файлу на любом уровне в текущем каталоге(**для рекурсивного подстановки .

В качестве альтернативы:

autoload zmv
zmv $'**/*\r' $'${f%\r}'

$fобозначает исходное имя файла, а расширение параметра${VARIABLE%SUFFIX}формы удаляет данный суффикс.

Рекомендация для вашего.zshrc:

autoload zmv
alias zcp='zmv -C'
alias zln='zln -L'
6
23.11.2021, 15:13

Теги

Похожие вопросы