Похоже, вы используете gnu sed
— в этом случае вы можете сделать что-то вроде
sed -s 'N;/PATTERN/!P;D' ./*.txt
С другими sed
вам придется просмотреть список файлов в цикле.
for file in ./*.txt
do
sed '$!N;/PATTERN/!P;D' "$file"
done
Это всегда будет держать две строки в пространстве шаблонов и печатать первую, если пространство шаблонов не совпадает, поэтому при вводе, подобном
some line
PATTERN
PATTERN
more
lines
another line
PATTERN
, он будет печатать
more
lines
замена значения одной переменной другой.
Это описание неверно по нескольким пунктам. Замена переменной заменяет имя переменной (плюс немного синтаксической ерунды) на ее значение. Кроме того, он работает не «в» переменной, а в команде. Это может быть команда, которая устанавливает значение переменной, но это только один случай из многих.
Например, команда echo $foo
отображает значение переменной. Исходный код содержит $foo
, а соответствующий вывод содержит значение переменной foo
.
Причина, по которой это называется «подстановкой переменных», заключается в том, что оболочка работает с последовательностью преобразований строк (и списков строк). Например (упрощенно), рассмотрим команду ls -l $dir/*.$ext
. Чтобы оценить это, последовательно происходит несколько вещей:
ls
, -l
и $dir/ *.$ext
. dir
равно /some/path
, а значение ext
равно txt
, тогда оболочка перезаписывает $dir/*.$ext
в /some/path/*.txt
. Это подстановка, потому что значение каждой переменной заменяется синтаксисом имени доллара. /some/path/*.txt
в список совпадающих имен файлов. ls
с вычисленными аргументами. (Синтаксис $foo
не просто заменяет значение переменной, но это уже другая история.)
В большинстве языков программирования для получения значения переменной достаточно напишите имя переменной. Оболочка предназначена для интерактивного использования; если вы пишете имя, оно интерпретируется как буквальная строка. Вот почему в синтаксисе для получения значения переменной есть дополнительный маркер, говорящий: «Я хочу получить значение переменной».
почему это действие требует специального термина вместо того, чтобы просто сказать «изменение значения переменной с редактированием его вручную в текстовом редакторе»?
Подстановка переменной не имеет ничего общего с изменением значения переменной. Изменение значения переменной является присваиванием.
Конечно, присваивание может содержать подстановки переменных, как и любая другая команда. Но подстановки переменных не предназначены специально для присваиваний.
Кроме того, вы не можете изменить значение переменная с помощью редактора. Уже объявленная переменная имеет значение в каждом процессе, это не конфигурация системы. У вас могут быть файлы конфигурации, которые устанавливают начальное значение переменной, и вы можете использовать редактор чтобы изменить это начальное значение в этих файлах, но после этого значение может измениться.