Eu tenho um arquivo de texto no Linux, onde o conteúdo é como abaixo:
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
Quero obter o conteúdo antes dos dois pontos, como abaixo:
help.helloworld.com
dev.helloworld.com
Como posso fazer isso dentro do terminal?
text-processing
grep
Gabrial Johnas
fonte
fonte
grep
utilitário é usado para procurar linhas que correspondam a expressões regulares. Você poderia usá-lo aqui, mas seria mais apropriado usar uma ferramenta que extrai dados de campos com algum delimitador, como ocut
utilitário.grep
é a ferramenta certa para resolver o problema real. problema.Respostas:
É para isso que
cut
serve:Você acabou de definir o delimitador para
:
with-d:
e pedir para imprimir apenas o 1º campo (-f1
).fonte
Ou uma alternativa:
Isso retorna todos os caracteres iniciados no início de cada linha (
^
) que não são dois pontos ([^:]*
).fonte
Definitivamente recomendaria
awk
:Usa
:
como um separador de campos e imprime o primeiro campo.fonte
resposta atualizada
Considerando o seguinte arquivo
file.txt
:Você pode usar
sed
para remover tudo após os dois pontos:Isso funciona para todos os casos de canto apontados nos comentários - se terminar em dois pontos, ou se não houver dois pontos, embora não tenham sido mencionados na pergunta em si. Obrigado a @Rakesh Sharma, @mirabilos e @Freddy pelos comentários. Responder a perguntas é uma ótima maneira de aprender.
fonte
sed -e 's/:.*//' file.txt
é outra maneira com o Posix sed.sed -ne 'y/:/\n/;P' file.txt
também pode ser usado..+
para.*
if
nas///p
sintaxe, você precisa modificar seu regex para cuidar de linhas sem dois pontos, algo como:sed -nEe 's/([^:]*)(:.*|)/\1/p'
. Note que isso requer,GNU sed
mas, de qualquer maneira, você está no GNU sed, portanto isso não deve importar.sed -n '/:/s/^\([^:]*\):.*$/\1/p
(adicione--posix
se você usar o GNU sed, apenas para apesar do extensionismo deles)Você quer dizer assim:
Resultado:
fonte
echo foo:bar:baz | grep -oP '.*(?=:)'
. Isso funcionará para o exemplo do OP, mas não para o caso geral, conforme descrito na pergunta.Você pode conseguir isso com o manuseio do string bash, removendo a correspondência mais longa do string diretamente para cada linha da seguinte maneira:
Essa pode ser uma alternativa útil se você estiver analisando o arquivo em um script de shell (embora eu suspeite que o uso de cut possa ser mais eficiente).
fonte
No shell POSIX puro, sem usar comandos externos, eu faria:
fonte