Используя sed (GNU sed) 4.2.2, я хочу:

  1. Match Line1
  2. Проверьте Line2 , чуть ниже Line1 , если он равен String
  3. Если это не - добавить String после Line1 (или вставить перед тем Line2

Что я пробовал:

echo -e "Line1\nLine2\nLine3" | sed '/Line1/n;/^String$/!iString'

но это возвращает:

Строка 1
строка
Line2
строка
Line3

Я также попробовал:

echo -e "Line1\nLine2\nLine3" | sed '/Line1/{n;/^String$/!iString}'

но возвращается

sed: -e выражение # 1, char 0: не найдено `{'

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

1 ответ1

0

Пытаться:

sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file

Ограничение: Если две строки с Line1 появляются в строке, это может или не может делать то, что вы хотите.

пример

Давайте рассмотрим этот тестовый файл:

$ cat file
Line1
String
Line2
String
Line3
Line1
Line2

И давайте применим нашу команду:

$ sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file
Line1
String
Line2
String
Line3
Line1
String
Line2

Как это устроено

  • Line1/{...}

    Это выполняет команды в фигурных скобках, только если текущая строка соответствует регулярному выражению Line1 .

  • N

    Это читает в следующей строке и добавляет его к текущей строке с двумя строками, разделенными новой строкой.

  • /\nString$/b

    Если вторая строка соответствует регулярному выражению \nString$ , пропустите оставшуюся часть команд ("branch", b).

  • s/\n/\nString\n/

    Это заменяет символ новой строки, который разделяет первую и вторую строки, символом новой строки, за которым следует String а затем еще одна строка .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .