perl -i -p -e 'if ($. == 1) {s/^\s+#!/#!/}' *
Это приведет к удалению начальных пробелов перед #!
ТОЛЬКО в первой строке ( $. == 1
) каждого файла. все остальные строки пропускаются без изменений. perl
обновит файлы независимо от того, изменилось что-нибудь или нет (т.е. у них будет новый индексный дескриптор и будут обновлены временные метки). См. man perlrun
и найдите второе вхождение -i \ [
для подробностей)
Если вы хотите только изменить (изменить временную метку, индексный дескриптор и т. Д.) Файлы, которые имеют ошибочный пробел-перед- # !, попробуйте что-то вроде этого:
awk '/^[[:blank:]]+#!/ && FNR==1 { printf "%s\0", FILENAME }; {nextfile}' * |
xargs -0r perl -i -p -e 'if ($. == 1) {s/^\s+#!/#!/}'
awk
выводит список совпадающих файлов (первая строка имеет начальные пробелы перед #!), разделенных NUL. Это загружается в xargs -0r
для запуска на них однострочного perl
.
Для функции nextfile
требуется GNU awk
. Его можно опустить в других версиях awk
, но он будет работать медленнее (поскольку он должен читать каждую строку каждого файла, а не переходить к следующему файлу после проверки первой строки).
Это можно было бы сделать полностью в perl
, но для этого потребовалось бы гораздо больше кода, чем просто передача вывода awk
в xargs perl