Respostas:
O awk pode ser uma ferramenta melhor aqui.
$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost
Procure linhas que contenham "POP3_SERVER_NAME"; imprima o último campo. Isso não depende de o POP3_SERVER_NAME estar sempre na linha 3, o que provavelmente é uma coisa boa.
$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost
Dependendo do seu aplicativo, pode ser necessário tornar a expressão regular mais rigorosa. Por exemplo, convém corresponder apenas a linha que começa com POP3_SERVER_NAME.
$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost
Usar sed é um pouco menos intuitivo. (Obrigado, estou ciente da ironia.) Aborde a linha que contém POP3_SERVER_NAME em qualquer lugar. Substitua uma sequência vazia por todo o texto do início da linha pelo espaço opcional após "=". Então imprima.
sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat
awk
espaços para outra coisa usando -F
. Por exemplo: -F "="
será usado =
como delimitador no caso mencionado.
Substitua o p
comando por uma substituição que remove a parte indesejada da linha.
sed -n '3 s/^[^=]*= *//p' installation.sh
Convém corresponder a linha por palavra-chave e não por posição.
sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost
Ou se você tiver o conteúdo em um arquivo:
sed 's/.*= //' somefile.txt
localhost
Parece que você tem um arquivo de configuração. O que você poderia fazer é semelhante ao que Adam Siemeon / slm sugere:
sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename
onde [^=]
exclui todos os '=' personagens, +
diz um ou mais do mesmo tipo de personagem, este seguido por um real =
, \s
qualquer espaço em branco (incluindo guias \t
e novas linhas \n
, \r\n
, e espaços simples '', enquanto *
meios zero ou mais do mesmo tipo , parênteses capturam o que está dentro para colocar as seqüências de caracteres correspondentes nos espaços reservados de substituição \ 1, \ 2, ..., \ n, $
significa o final de uma linha, seguindo o padrão de substituição típico de: s/.../.../modifiers
.A opção de linha de comando -r
significa sintaxe regex estendida (por uma questão de conveniência) e -n
significa saída nada até ou a menos que seja solicitado explicitamente.O p
modificador imprime o resultado.
Você pode fazer uma pesquisa global com o g
modificador como:
sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename # note the space after \1
para que você obtenha uma string separada por ' '
(poderia ser \n
, \t
ou o que você tem) que você pode processar facilmente.
Ambos são válidos desde que seus valores precedidos pelo caractere da equação abranjam até o final de uma linha e não sejam seguidos por comentários ou outros caracteres com semântica que se desvie de um "valor" simples.
Ainda não posso comentar aqui nas postagens de outras pessoas. Para indicar a linha, basta passar o número da linha, no seu caso 3, antes s
ou antes do caractere de cotação inicial (como no vim).
sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename
Por favor, dê uma olhada info sed
. Por exemplo, 3.2 e 4.7 são de particular interesse para você.
A beleza do Linux / Unix é que geralmente há mais de uma maneira de realizar alguma coisa. No caso da operação, há pelo menos quatro maneiras diferentes de extrair o nome do servidor POP do arquivo:
grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2
grep POP3_SERVER_NAME installation.sh | awk '{print $3}'
grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'
sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
awk
comando é bom - mas apenas se você tiver espaços ao redor do=
. Não vai funcionarPOP3_SERVER_NAME=localhost
.