Se você deseja extrair apenas os nomes de login que não contêm o caractere @, o seguinte comando sed pode ser útil:
echo -e "P=esmtpa A=courier_login:[email protected] S=1573 id=f1cd08396,...\nP=esmtpa A=courier_login:name2 S=1573 id=f1cd08396,..." | \
sed -nr 's/^.*_login:([^ @]+) .*$//p'
A execução deste script resultará na saída abaixo:
name2
Algumas explicações:
-
A primeira linha apenas ecoa 2 linhas de dados de exemplo (separados por um caractere \n de nova linha).
-
A segunda linha contém o comando sed -nr , que neste caso usa a sintaxe s/regexp/replacement/p . Ele ( s ) procura na linha uma expressão regular regexp correspondente ( -r ). Se uma parte da linha for correspondida, o replacement será usado para substituir a parte correspondente. Os comandos -n e p só precisam omitir as linhas que não correspondem ao regexp .
-
sed localiza a string " _login: " em uma linha. Naquela posição:
- O colchete de abertura marca o início de uma subexpressão. (Considere uma região da linha.)
- O
[^ @]+ corresponde a mais um caractere que não é um espaço nem @. Ele será expandido até que um caractere de espaço seja encontrado.
- O colchete de fechamento marca o final da subexpressão logo antes desse caractere. A região correspondida é armazenada em uma variável chamada
.
- Se você der uma olhada na parte
regexp , ela segue basicamente o padrão ^.*something.*$ . O ^.* corresponde a qualquer caractere no início da linha até a expressão algo . Da mesma forma, o .*$ corresponde a qualquer caractere no final da linha após a expressão algo . A correspondência da linha inteira com o regexp é importante, porque a parte inteira correspondida é substituída.
- A peça de substituição contém apenas a variável
, portanto, o nome de login correspondente será substituído.