Замените повторяющиеся строки на строку, сопоставив их с регулярным выражением - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть ряд строк, которые я получаю из вывода команды.Они следуют этой схеме:

payload
constant value(u) constant(u)
payload
constant value(u) constant(u)
payload

В этом примере (u) - неизвестный символ / символы.

Что меня волнует, так это «полезная нагрузка», поэтому я удаляю «постоянное значение».(u) константа (u) "строк (сохраняя каждую вторую строку) с использованием sed:

sed -n '1~2!p'

Иногда, однако, существует дублирующая константа (u) константы (u) (u) «line и которое заставляет sed возвращать все следующие строки« constant value (u) constant (u) »» вместо строк «payload».

Я могу использовать регулярное выражение для удаления всех «констант»value (u) constant (u) "lines:

sed '/^constant.*constant.*$/d'

Но проблема в том, что у меня должно быть представление, что эта строка была там, даже если это не" полезная нагрузка "строка, поэтому я хочу заменить содержимое этой проблемной повторяющейся строки какой-либо строкой.Я хочу заменить только «проблемные» дублирующие строки.

Итак, вот пример ввода в обычном формате:

after 1 hour
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
after 2 hours
Cras id consequat nisl.
after 2 hours
Etiam non metus eu velit maximus dapibus.
after 1 hour
Etiam a mi quis ante congue posuere.
after 5 hours
Suspendisse et venenatis ipsum, aliquet pharetra tortor.

Это «проблемный» ввод:

after 1 hour
after 6 hours
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
after 2 hours
Cras id consequat nisl.
after 2 hours
Etiam non metus eu velit maximus dapibus.
after 1 hour
Etiam a mi quis ante congue posuere.
after 5 hours
Suspendisse et venenatis ipsum, aliquet pharetra tortor.

Желаемый результат (в случае проблемного ввода выше):

(no information)
after 6 hours
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
after 2 hours
Cras id consequat nisl.
after 2 hours
Etiam non metus eu velit maximus dapibus.
after 1 hour
Etiam a mi quis ante congue posuere.
after 5 hours
Suspendisse et venenatis ipsum, aliquet pharetra tortor.

Как подойти к этому наиболее эффективным способом?Я думаю, что я должен сопоставить «проблемные» строки с регулярным выражением и заменить их на нужную строку, но как?

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Эта команда найдет 2 последовательные строки, начинающиеся с constant, и заменит 2-ю строку на X:

sed '/^constant.*$/ { N; s/\(^constant.*\n\)constant.*$/\1X/; }'

ОБНОВЛЕНИЕ

На основеДополнительная информация, которую вы предоставили, должна помочь:

sed '/^after .*$/ { N; s/^after .*\(\nafter .*\)$/(no information)\1/; }'

ОБНОВЛЕНИЕ # 2

Другое решение, предоставленное @potong в комментариях:

sed -E '/^after/{N;s/.*(\nafter)/(no information)\1/;P;D}'

Это также будет работать в тех случаях, когда в строке более двух «проблемных» строк, и заменит все из них на (no information).

0 голосов
/ 23 сентября 2019

Находятся ли дубликаты рядом друг с другом?Если это так, просто сначала запустите файл через uniq

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...