Функция d и t в контексте подстановки sed - PullRequest
1 голос
/ 05 августа 2020

Я использовал генератор подстановки для sed, и он дает мне

sed -E 's/([^ ]+)│m/\1│T/gm;t;d'

Я знаком с флагами регулярных выражений g и m, но я никогда не видел t и d. После их просмотра кажется, что t предназначен для тестирования, а d - для удаления. Но что это значит в данном конкретном контексте? Что они вносят в полную команду?

Ответы [ 2 ]

1 голос
/ 05 августа 2020

sed - это собственный "язык" со своими командами. Это не «инструмент регулярных выражений», а скорее «редактор потока».

Я знаком с флагами регулярных выражений g и m,

s команда имеет собственные модификаторы, а m - это расширение GNU. Я не совсем понимаю, как это используется здесь, поскольку sed читает здесь по одной строке за раз, а m изменяет поведение ^ и $ ....

Но в данном конкретном контексте, что это означает?

В любом возможном контексте команда t переходит к метке, если (любая) команда s/// была успешной. Если метка не указана, выполняется переход к концу скрипта.

Команда d удаляет пространство шаблонов, эффективно удаляя строку при типичном синтаксическом анализе.

t;d - мнемоник c, чтобы удалить строку, если последняя команда s не удалась. Я предпочитаю делать /pattern/!d; s//replacement/g, что более читабельно для моих глаз.

Ссылкой на поведение sed будет документация posix sed и документация gnu sed .

1 голос
/ 05 августа 2020

Цитирование sed руководство:

d: Удалить пространство образца. Начать следующий цикл.

t label: если s/// выполнил успешную замену с момента чтения последней строки ввода и с момента последней команды t или T, затем перейдите к label; если label опущено, перейти к концу скрипта.

Другими словами, если команда s завершилась успешно, распечатайте полученный пробел шаблона, иначе пропустите (удалите) строку.

Другой способ express это:

sed -n -E 's/([^ ]+) m/\1 T/gmp'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...