Изменение текста между возможными ключевыми словами в скрипте bash с использованием sed - PullRequest
0 голосов
/ 14 декабря 2018

Мой input файл содержит текст, который необходимо изменить.Например, у него есть несколько возможностей:

CONSTANT change/me !KEY2 !KEY3
CONSTANT change/me 
CONSTANT change/me !DIFFERENTKEY

Всегда существует постоянный ключ (т. Е. CONSTANT), который не изменяется.Существует также возможность различных ключевых слов после текста, который необходимо заменить.Они обозначены восклицательным знаком (!), и не может быть других ключевых слов или тысяч.Меня интересует только замена текста после CONSTANT и любых возможных клавиш, начинающихся с !.Желательно использовать sed.

Ниже приводится мой ожидаемый результат.change/me в input необходимо заменить на changed;

CONSTANT changed !KEY2 !KEY3
CONSTANT changed 
CONSTANT changed !DIFFERENTKEY

Я пробовал разные вещи, найденные в ответах ( здесь и здесь , здесь ) на SO, но я не могу понять это.Самый близкий, который я получил, был от этой ссылки.

sed -r 's/(^CONSTANT) (.+?) (\!.*$)/\1 changed \3/g' input

Что приводит к;

CONSTANT changed !KEY2
CONSTANT change/me
CONSTANT changed !DIFFERENTKEY

Я пробовал разные комбинации, но на этомЯ чувствую, что я просто стреляю в темноте.

Условия:

  • CONSTANT не меняется
  • change/meпроизвольный текст также может быть blahblah, который необходимо заменить
  • A !KEY не обязательно должен присутствовать
  • A !KEY может присутствовать и может быть несколько из них, но всегда разделяется пробелом.Я хочу сохранить CONSTANT и любые возможные !KEY с.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Не утруждайте себя обработкой всей строки, не имеет значения, появляется ли дополнительный текст после текста для изменения:

sed 's@^CONSTANT change/me@CONSTANT changed@'

Я использовал @ в качестве разделителя вместо обычного /чтобы избежать необходимости экранирования / в change/me.

Вы можете попробовать это здесь .

Если текст change/me меняется, но никогда не содержитвместо пробелов вы можете использовать следующее:

sed -E 's@^CONSTANT [^ ]+@CONSTANT changed@'

(для более старых версий GNU sed вы захотите использовать флаг -r вместо -E)

Вы можете попробуйте здесь .

0 голосов
/ 14 декабря 2018

Третий (\!*.*$) вынужден начинаться с !, и строка 2 не совпадает.

Обратите внимание, что (.+?) (\! ... заставляет sed искать самую длинную последовательность для (.+?) upдо !..., поэтому !KEY2 потеряно.

Обязательно: change/me никогда не содержит !, чтобы решение, приведенное ниже, сработало.

Попробуйте:

sed -r 's/(^CONSTANT) ([^!]+?) *(\!.*|.*)$/\1 changed \3/g' input

Вывод

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