Как вставить строку после определенного шаблона?

Я пытаюсь вставить шаблон с именем «без комментариев» после строки «3 3 1 мая 7 05:31:11 2019» в следующем примере файла

INV_YTEC_TR::
3 3 1 May  7 05:31:11 2019
CA AOI1 0 0 -1 -3176120 1602000 12
A 0.4

Попробовал после sed код, но это не помогло.

sed -i 's/\(^\d+\s+\d+\s+\d+\s+[A-Za-z]+\s+\d+\s+\d+:\d+:\d+\s+\d+.*$\)/\1\nno comments/ig' tmp.txt 

Может ли кто-нибудь помочь мне с правильной командой sed?

С уважением, Шиха

1
задан 7 May 2019 в 21:11

1 ответ

GNU sed не знает сокращения \d, вы можете использовать вместо него [0-9] или [:digit:], и вам нужно включить синтаксис расширенного регулярного выражения (ERE) с опцией -r для [ 1110] для распознавания в качестве метасимвола:

sed -ir 's/^[0-9]+\s+[0-9]+\s+[0-9]+\s+[A-Za-z]+\s+[0-9]+\s+[0-9]+:[0-9]+:[0-9]+\s+[0-9]+.*/&\nno comments/' tmp.txt

& справа заменяется на целое совпадение, поэтому вам не нужно создавать группу. $ в конце нет необходимости, если ваше выражение заканчивается на .*. Флаг g lobally заставляет sed заменять все совпадения в строке, что не требуется, когда вы уже сопоставляете всю строку. Флажок i делает регулярное выражение нечувствительным к регистру, но вы уже сделали это, используя [A-Za-z], а не [a-z] или [A-Z], так что вы также можете опустить это.

Группы - это не только способ вырезать части совпадения, чтобы использовать его в замене, они также служат способом объединения последовательностей. В вашем случае они пригодятся для слияния, например.

[0-9]+\s+[0-9]+\s+[0-9]+\s+

-

([0-9]+\s+){3}

, что сокращает ваше регулярное выражение:

sed -ir 's/^([0-9]+\s+){3}[A-Za-z]+\s+[0-9]+\s+([0-9]+:){2}[0-9]+\s+[0-9]+.*/&\nno comments/' tmp.txt

Пример выполнения

$ <s sed -r 's/^([0-9]+\s+){3}[A-Za-z]+\s+[0-9]+\s+([0-9]+:){2}[0-9]+\s+[0-9]+.*/&\nno comments/'
INV_YTEC_TR::
3 3 1 May  7 05:31:11 2019
no comments
CA AOI1 0 0 -1 -3176120 1602000 12
A 0.4

Дальнейшее чтение

0
ответ дан 7 May 2019 в 21:11

Другие вопросы по тегам:

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