Como apagar o resto de cada linha após um determinado padrão ou uma string em um arquivo?

13

Suponha que eu tenha uma lista de URLs em um arquivo de texto:

google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

Eu quero excluir tudo o que vem depois de '.com'.

Resultados esperados:

google.com
unix.stackexchange.com
isuckatunix.com

Eu tentei

sed 's/.com*//' file.txt 

mas também excluiu .com .

    
por Koshur 25.01.2016 / 13:39

4 respostas

11

Para excluir explicitamente tudo o que vem depois de ".com", basta ajustar sua solução de sed existente para substituir ".com (anything)" por ".com":

sed 's/\.com.*/.com/' file.txt

Eu ajustei seu regex para escapar do primeiro período; caso contrário, teria correspondido algo como "thisiscommon.com/something".

Observe que você pode querer ancorar ainda mais o padrão ".com" com uma barra vertical para que você não apare acidentalmente em algo como "sub.com.domain.com/foo":

sed 's/\.com\/.*/.com/' file.txt
    
por 25.01.2016 / 16:16
6

Você pode usar o separador de campo awk ( -F ) seguinte maneira:

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

$ cat file | awk -F '\.com' '{print $1".com"}'
google.com
unix.stackexchange.com
isuckatunix.com

Explicação:

NAME
       awk - pattern scanning and processing language

-F fs
       --field-separator fs
              Use fs for the input field separator (the value of the FS predefined variable).

Como você deseja excluir todas as coisas depois de .com , -F '.com' separa a linha com .com e print $1 fornece a saída apenas da parte antes de .com . Portanto, $1".com" adiciona .com e fornece a saída esperada.

    
por 25.01.2016 / 13:52
4

A melhor ferramenta para edição de arquivos não interativos no local é ex .

ex -sc '%s/\(\.com\).*// | x' file.txt

Se você usou vi e se você já digitou um comando que começa com dois pontos : , você usou um comando ex. É claro que muitos dos comandos mais avançados ou "sofisticados" que você pode executar dessa forma são extensões Vim (por exemplo, :bufdo ) e não estão definidos no Especificações do POSIX para ex , mas essas especificações permitem um grau verdadeiramente surpreendente de poder e flexibilidade na edição de texto não visual (seja interativo ou automatizado).

O comando acima tem várias partes.

-s ativa o modo silencioso para preparar ex para uso em lote. (Suprimir mensagens de saída et al.)

-c especifica o comando a ser executado quando o arquivo ( file.txt , neste caso) é aberto em um buffer.

% é um especificador de endereço equivalente a 1,$ - significa que o seguinte comando é aplicado a todas as linhas do buffer.

s é o comando substituto com o qual você provavelmente já está familiarizado. É comumente usado em vi e tem recursos essencialmente idênticos ao comando s de sed , embora alguns dos recursos avançados de regex possam variar de acordo com a implementação. Neste caso, de ".com" até o final da linha é substituído por apenas ".com".

A barra vertical separa os comandos sequenciais a serem executados. Em muitas (%) implementações ex você também pode usar uma opção -c adicional, assim:

ex -sc '%s/\(\.com\).*//' -c x file.txt

No entanto, isso não é exigido pelo POSIX.

O comando x sai, depois de gravar qualquer alteração no arquivo. Ao contrário de wq , que significa "escrever e sair", x apenas grava no arquivo se o buffer tiver sido editado. Assim, se seu arquivo estiver inalterado, o registro de data e hora será preservado.

    
por 25.01.2016 / 14:19
2

Modo python muito rápido, simples e sujo:

#!/usr/bin/env python
import sys
with open( sys.argv[1]  ) as file:
    for line in file:
        print line.split("/")[0]

Execução de amostra

skolodya@ubuntu:$ chmod +x removeStrings.py                                   

skolodya@ubuntu:$ ./removeStrings.py strings.txt                              
google.com
unix.stackexchange.com
isuckatunix.com


skolodya@ubuntu:$ cat strings.txt                                             
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo
    
por 25.01.2016 / 20:57