Como remover tudo entre dois caracteres com sed?

0

Eu tenho um arquivo que contém um total de 482 linhas que eu quero remover ~~ adt * ~~ . É assim que o conteúdo se parece:

478|~~adt00000aa9~~~~adt0000000b~~14395189_p0.jpg
479|~~adt00000995~~44836628_p0.jpg
480|~~adt00000aae~~Miku_Collab_2_by_Luciaraio.jpg

Eu tentei sed 's/~~adt*~//' file > new_file , mas não removi tudo.

Como posso remover tudo entre o primeiro e o último dois sinais ~~?

    
por Weylyn Savan 07.09.2017 / 21:04

3 respostas

2

Dado que você deseja remover ~~adt(something)~~ e que pode haver ~~(something different)~~ em outras linhas (não mostradas na pergunta):

$ sed 's/~~adt[^~]*~~//g' file.in >file.out

Para os dados fornecidos, isso gerará

478|14395189_p0.jpg
479|44836628_p0.jpg
480|Miku_Collab_2_by_Luciaraio.jpg

Alterando o adt da última linha para xxx , o comando gera

478|14395189_p0.jpg
479|44836628_p0.jpg
480|~~xxx00000aae~~Miku_Collab_2_by_Luciaraio.jpg

O padrão ~~adt[^~]*~~ corresponderá a todas as ocorrências de ~~adt seguidas por qualquer número de caracteres que não sejam ~ e, em seguida, ~~ novamente. O /g no final garantirá que todas essas correspondências em todas as linhas sejam removidas.

    
por 07.09.2017 / 21:23
1

adt* significa a seguido por d seguido por qualquer número de t incluindo 0.

O ponto corresponde a qualquer caractere, então use

~~adt.*~

Para corresponder ~~adt seguido por qualquer número (incluindo 0) de caracteres, seguido por ~ .

    
por 07.09.2017 / 21:12
1

Você pode tentar isso:

sed 's/~.*~//' file > file_new

A saída será:

478|14395189_p0.jpg
479|44836628_p0.jpg
480|Miku_Collab_2_by_Luciaraio.jpg
    
por 07.09.2017 / 21:12