Como deletar tudo (em cada linha) em um arquivo de texto após um padrão de caracteres (incluindo o padrão)?

Como deletar tudo (em cada linha) em um arquivo de texto após um padrão de caracteres (incluindo o padrão)?

Basicamente eu preciso do que o OP desta questão conseguiu, mas não quis. Como deletar tudo após um determinado padrão ou string em um arquivo?

Então obtive dados como:

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

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

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

Tentei fazer com que a primeira resposta (sed) dessa pergunta funcionasse, 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 ser excluído ou restarem três pontos.

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

Também tentei ajustar o comando desta resposta, mas também falhei.Como posso deletar tudo até um padrão e tudo depois de outro padrão de uma linha?

Responder1

sed 's/ \.\..*$//' /path/to/fileDeveria trabalhar:

 \.\. - A space followed by two literal periods
.*    - One or characters of any type
$     - End of line 

Responder2

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

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

onde:

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

  • s/expr//gsignifica substituto combinado exprcom nada, tanto quanto você puder (g)

Responder3

Que tal agora:

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

que significa:

um+para+muitos(+)pontos(\.)E zero para muitos(*)espaços( )E um+para+muitos(+) dígitos([[:dígito:]])E apenas no caso de qualquer(*) espaço em branco ([[:espaço:]])AND Fim desta linha ($)

Testado com (observe que inseri "...234" na segunda linha e guias/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$ 

informação relacionada