Рейтинг:1

Применять операции sed только к строкам, начинающимся с определенной строки

флаг bd

У меня есть следующий формат файла

Получено от +11231231234 в 2021-10-10T19:56:50-07:00:
Это сообщение, содержащее такие слова, как from, at и т. д.

Отправлено на +11231231234 в 2021-10-11T06:50:57+00:00:
Это еще одно сообщение, содержащее такие слова, как to, at и т. д.

Я хочу очистить строки «Получено» и «Отправлено», для этого используются следующие команды sed.

кошачий файл | sed 's/от//g' | sed 's/to//g' | sed 's/+\w\+//' | \ 
sed 's/at//g' | sed 's/T//g' | sed 's/[[:digit:].]*\:$//' | \ 
sed 's/[[:digit:].]*\:$//' | sed 's/-$//' | sed 's/-$//' | sed 's/+$//'

и приводит к следующему

Поступило 2021-10-10 19:56:50
Это сообщение, содержащее такие слова, как , , и т.д.

Отправлено 2021-10-11 06:50:57
Это еще одно сообщение, содержащее такие слова, как , и т. д.

Как видите, он хорошо очищает строки «Получено» и «Отправлено». Но это также очищает строки сообщений! Как я могу применить эти операции только к строкам, начинающимся с «Получено» и «Отправлено»?

флаг tm
Кросспостинг в [Unix и Linux] (https://unix.stackexchange.com/q/679965/13792)
Рейтинг:2
флаг in

Вы можете использовать шаблон, чтобы выбрать, к каким строкам применить последующую команду:

sed '/^Отправлено\|^Получено/ s/шаблон/замена/' ваш_файл

Бонус

На самом деле вы можете сделать все свои правки одной великолепной командой sed:

sed '/^Получено\|^Отправлено/ s/\(^[^ ]*\).*at \(.*\)T\(.*\)[-+].*/\1 \2 \3 /' ваш_файл

По сути, шаблон соответствует каждому фрагменту текста в строке, и мы просто «запомнить» все биты, которые мы хотим сохранить, а затем заменить всю строку на их.

Вывод:

Поступило 10.10.2021 19:56:50
Это сообщение, содержащее такие слова, как from, at и т. д.

Отправлено 2021-10-11 06:50:57
Это еще одно сообщение, содержащее такие слова, как to, at и т. д.

Это работает следующим образом:

  • \( и \) представляют собой «группы захвата», которые запоминают все, что было сопоставлено в между ними.
  • ^[^ ]* соответствует началу строки, за которой следует любое количество последовательные непробельные символы (т. е. первое слово в строке).
  • .*в соответствует всему, включая слово 'at' (и пробел следующий за ним) - он не входит в группу захвата и поэтому не «запоминается».
  • \(.*\)Т помнит (во второй группе захвата) все до, но не включая заглавную букву «Т».
  • \(.*\)[-+].* помнит (в третьей группе захвата) все до, но не включая «-» или «+» (и все, что следует за «-/+»).
  • /\1 \2 \3/ означает заменить совпадение (т.е. всю строку) на содержимое 1-й, 2-й и 3-й групп захвата.

Эта страница очень хорошо объясняет sed - также у него есть фантастический набор другой юникс учебники.

jf4i2d avatar
флаг bd
спасибо сексуальный мужчина

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.