![Как найти слово в файле и вставить текст на две строки ниже?](https://rvso.com/image/97225/%D0%9A%D0%B0%D0%BA%20%D0%BD%D0%B0%D0%B9%D1%82%D0%B8%20%D1%81%D0%BB%D0%BE%D0%B2%D0%BE%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B5%20%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%20%D0%BD%D0%B0%20%D0%B4%D0%B2%D0%B5%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D0%BD%D0%B8%D0%B6%D0%B5%3F.png)
У меня есть файл, в котором я хочу найти ключевое слово и ввести текст на две строки ниже.
Например, предположим, что мой файл содержит следующие слова:
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
записать изменения на месте.