Usando sed
, você pode primeiro obter os números de linha das linhas correspondentes, decremento & incremente um número de linha em um loop while
e, em seguida, use sed -n "n1,n2p"
para imprimir linhas de contexto principal ( n1
) e final ( n2
) (semelhante à alternativa sed
sugerida pelo usuário455). Muitos processos de leitura podem levar a um impacto no desempenho.
ed
pode referenciar diretamente as linhas anteriores e seguintes de uma linha correspondente, mas falhará se o intervalo de linhas especificado não existir; por exemplo, a linha correspondente é a linha número 2, mas 5 linhas pré-correspondência devem ser impressas. Usando ed
, é necessário adicionar um número apropriado de linhas (vazias) no início e no final. (Para arquivos enormes ed
pode não ser a ferramenta certa, consulte: bfs - scanner de arquivo grande ).
# sample code to match lines with number 5 plus previous & following line
# (using Bash)
printf '%s\n' {1..20} > num.txt
# sed
sed -n '/5/=' num.txt | while read num; do
n1=$((num - 1))
n2=$((num + 1))
[[ $n1 -lt 1 ]] && n1=1
sed -n "${n1},${n2}p" num.txt
echo --
done | sed -e '${/^--$/d;}'
# ed
cat <<-'EOF' | ed -s num.txt | sed -e $'N;N;a\\n--' | sed -e '${/^--$/d;}'
H
0i
beginning: added line one
.
$a
end: added line one
.
,g/5/km\
'm-1,'m+1p
q
EOF