Как найти слово в файле и вставить текст на две строки ниже?

Как найти слово в файле и вставить текст на две строки ниже?

У меня есть файл, в котором я хочу найти ключевое слово и ввести текст на две строки ниже.

Например, предположим, что мой файл содержит следующие слова:

the
cow
goes
moo

Я хочу иметь возможность найти слово «корова» и ввести текст «ура» в файл на две строки ниже слова корова.

the
cow
goes
moo
yay

Я думаю, что это можно сделать, sedно не могу заставить это работать.

Любая помощь будет высоко оценена.

решение1

$ cat ip.txt 
the
cow
goes
moo

$ sed '/cow/{N;N; s/$/\nyay/}' ip.txt 
the
cow
goes
moo
yay
  • N;N;получить следующие две строки
  • s/$/\nyay/добавить еще одну строку

решение2

С awk:

awk '/cow/ {print; getline; print; getline; print; print "yay"; next}; 1'
  • /cow/совпадает cowс записью, а затем {print; getline; print; getline; print; print "yay"; next}печатает строку, getlineполучает следующую строку, которая тоже печатается, то же самое для следующей, а затем yayпечатается, затем переходит к следующей строке ( next)

  • 1(true) выведет остальные строки как действие по умолчанию

Предостережение:

  • Если между шаблоном для поиска и EOF меньше двух строк, то последняя строка, начинающаяся с шаблона, будет повторена, чтобы между ними образовалось две строки.

Пример:

% cat file.txt
the
cow
goes
moo

% awk '/cow/ {print; getline; print; getline; print; print "yay"; next}; 1' file.txt
the
cow
goes
moo
yay

решение3

Другойсед

sed '/cow/! b;n;n;a\yay' file.txt

Другойawk

awk '{print;this--};/cow/{this=2}! this{print "yay"}' file.txt

решение4

Сed

ed file << EOF
/cow/+2a
yay
.
,p
q
EOF

распечатать измененный вывод; или

ed file << EOF
/cow/+2a
yay
.
wq
EOF

или (в bashодной строке)

printf '%b\n' '/cow/+2a' 'yay\n.' 'wq' | ed file

записать изменения на месте.

Связанный контент