Como apagar tudo (em todas as linhas) em um arquivo de texto depois de um padrão de caracteres (incluindo o padrão)?

0

Basicamente, eu preciso do que o OP dessa pergunta tem, mas não quer. Como apagar tudo depois de um determinado padrão ou uma string em um arquivo?

Então eu peguei os dados como:

Something and something ........................... 23
Another one .......................................123
Somethingelse Inc. .................................243

Então, o que eu quero é excluir todo o grupo de pontos (e os números) após o espaço.

Até agora, tentei usar o comando do OP, mas ele não funcionou como eu esperava, porque ele exclui tudo após o primeiro ponto que encontra. O que significa que o ponto nos dados do tipo Somethinelse Inc. também é excluído.

Eu tentei fazer a primeira (sed) resposta a partir dessa questão, substituindo o primeiro .com por três pontos e o segundo por um espaço vazio, mas falhei. Desta vez, tudo após o primeiro espaço é apagado ou restam três pontos.

A segunda resposta (ex-sc ...) funcionou como o OP queria, mas deixa alguns pontos para mim, então eu também não tive sorte.

Eu também tentei ajustar o comando a partir desta resposta, mas também falhei nisso. Como posso excluir tudo até um padrão e tudo depois de outro padrão de uma linha?

    
por Shaban Shneta 01.11.2016 / 17:48

3 respostas

1

sed 's/ \.\..*$//' /path/to/file deve funcionar:

 \.\. - A space followed by two literal periods
.*    - One or characters of any type
$     - End of line 
    
por 01.11.2016 / 18:03
0

Outra solução, menos deselegante, poderia ser:

cat path/to/yourfile | sed -E "s/[\.]{2,}//g" | sed "s/[0-9]//g" > path/to/new_file

onde:

  • -E Interpretar expressões regulares como expressões regulares estendidas (modernas)
  • [\.]{2,} corresponde a um ponto por duas ou mais ocorrências
  • [0-9] corresponde a todos os dígitos

  • s/expr//g significa substituir expr com nada o máximo que você puder (g)

por 01.11.2016 / 18:13
0

Que tal isso:

sed 's/\.\+ *[[:digit:]]\+[[:space:]]*$//g'

o que significa:

one+to+many (\+) dots (\.) AND zero-to-many (*) spaces ( ) AND one+to+many (\+) digits([[:digit:]]) AND just-in-case any (*) whitespace ([[:space:]]) AND End of this line ($)

Testado com (observe que eu inseri "... 234" na segunda linha e tabulação / espaços à direita):

Something and something ........................... 23<Tab>
An ...234 other one .......................................123<space>
Somethingelse Inc. .................................243<some spaces>

E o resultado:

xb@dnxb:/tmp$ sed 's/\.\+ *[[:digit:]]\+[[:space:]]*$//g' sample.txt
Something and something 
An ...234 other one 
Somethingelse Inc. 
xb@dnxb:/tmp$ 
    
por 01.11.2016 / 18:07