As ferramentas Unix são mais frequentemente orientadas a linhas e, portanto, não há como aplicar uma expressão regular em várias linhas de entrada usando a caixa de ferramentas padrão.
sed
pode ser feito para processar o arquivo de forma que ele consiga detectar as linhas que você está procurando, mas fazemos isso estritamente usando operações em linhas individuais:
$ sed -n '/^Text/{N;/^Text\nLine/=;D;}' file
10
Este script sed
procura a string Text
no início de uma linha. Quando encontrado, ele anexa a próxima linha ao seu buffer com um \n
intermediário.
Se o buffer agora corresponder a ^Text\nLine
, o número da linha atual será gerado usando o comando =
em sed
. O número da linha resultante é o da linha Line
no arquivo.
Observe que, embora a segunda expressão regular pareça corresponder a uma nova linha no arquivo, isso não acontece. Ele corresponde a uma nova linha em seu buffer interno, que nós colocamos lá usando o comando N
quando lemos a próxima linha do arquivo.
Você provavelmente usaria isso em um loop se quiser aplicá-lo em vários arquivos:
for name in pattern; do
printf 'Processing %s...\n' "$name"
sed -n '/^Text/{N;/^Text\nLine/=;D;}' "$name"
done
onde pattern
seria um padrão de globbing de nome de arquivo comum que corresponde aos arquivos em que você está interessado.