Примерно так:
sed '/^[[:blank:]]*B$/{n;s/Hello/Hi/g;}'
Предполагается, что нет последовательных B
s (одна строка B
, за которой следует другая B
) линия).
В противном случае вы можете сделать:
awk 'last ~ /^[[:blank:]]*B$/ {gsub("Hello", "Hi")}; {print; last=$0}'
Эквивалент sed
будет выглядеть так:
sed 'x;/^[[:blank:]]*B$/{
g;s/Hello/Hi/;b
}
g'
Чтобы заменить второе слово после B
, или заменить world
] с вселенной
, только если две строки выше содержат B
:
awk 'l2 ~ /B/ {gsub("world","universe")}; {print; l2=l1; l1=$0}'
Чтобы обобщить его на n
строк выше:
awk -v n=12 'l[NR%n] ~ /B/ {gsub("foo", "bar")}; {print; l[NR%n]=$0}'
Попробуйте это:
perl -0ne 'print $& if /^Host.*?IdentityFile\s+\K[^\n]+/ms' file