Мониторинг использования полосы пропускания [дубликат ]

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

2
13.04.2017, 15:36
0 ответов

Теги

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