В ответах поясняется, что -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
)
Как объясняется в комментарии, это работает в 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
перезаписывает часть до ).
Для массового -переименования (или массового -копирования )файлов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'