Я наткнулся на этот код в учебнике; в книге сказано только, что это 1,/^[ ]*$/d
означает «Удалить от строки 1 до первой пустой строки». Что конкретно означает каждый символ?
ed $1 << EOF
1,/^[ ]*$/d
w
q
EOF
решение1
1,/.../
означает диапазон от 1-й строки до строки, соответствующей шаблону между /
.
/^[ ]*$/
соответствует строке, содержащей 0 или любое количество пробелов [ ]*
от начала ^
до конца $
строки.
Неясно, является ли код в вопросе намеренным и является ли он точной копией из книги. Скобки вокруг одного пробела не нужны. Возможно, оригинальный автор хотел, чтобы между скобками был пробел и символ табуляции, которые можно было бы заменить на класс символов [[:blank:]]
.
d
это команда для удаления строки
w
написать файл
q
выйти из редактора
Эти команды отправляются ed
черезздесь документ, обозначенное << EOF
. EOF
Строка представляет собой полупроизвольное имя, которое связано с EOF
четырьмя другими строками ниже. Если оставить EOF
без кавычек, то все переменные в промежуточных строках будут расширены.
Еще одно, на что следует обратить внимание, это отсутствие кавычек в примере $1
. ed
Команда/скрипт будет выполнена для первого позиционного параметра (аргумента скрипта или функции)подлежит дальнейшему разделению пробелов и генерации имени файла. Аргумент действительно следует процитировать. Для дальнейшего чтения см.Почему мой скрипт оболочки тормозит пробелы и другие специальные символы?иПоследствия для безопасности, если забыть заключить переменную в кавычки в оболочках bash/POSIX.
решение2
Команда и ввод
— $1
это имя файла, который необходимо отредактировать, а все, что находится между EOF, — это команды для редактирования ed
.
Подробный рассказ о1,/^[ ]*$/d
1,
начать с линии1
и в этом случае продолжайте до первого появления строки поиска/
указывает, что мы собираемся искать строку^
указывает, что мы хотим сопоставить начало строки в файле[
указывает, что мы собираемся указать много символов- '
' мы хотим сопоставить пробел - обычно здесь было бы больше символов
]
завершено указание символов*
мы хотим сопоставить 0 или более пробелов (или любых других символов между[]
)$
до конца строки в файле/
закрытие поискаd
удалить строку
Затем следующая строка w
записывает изменения и q
завершает работу ed
.
Эффект
Если первая строка файла ( $1
) пуста или содержит только пробелы (без табуляции), то она будет удалена.