Usando sed para deletar tudo entre duas palavras?

5

Este parece não funcionar

The next example would delete everything between "ONE" and "TWO:" 

#!/bin/sh
sed '
/ONE/ {
# append a line
    N
# search for TWO on the second line 
    /\n.*TWO/ {
# found it - now edit making one line
        s/ONE.*\n.*TWO/ONE TWO/
    }
}' file

Eu estava esperando para apagar tudo entre um e dois. Eu tentei com o arquivo onde o arquivo contém.

[user5@mailserver ~]$ cat file
ONE
hello
TWO

mas a saída vem como

[user5@mailserver ~]$ ./test
ONE
hello
TWO

Eu estava esperando ONE TWO Eu estou tentando fazer isso correto, mas não é capaz de fazer.

    
por munish 27.08.2013 / 14:24

2 respostas

5

Isso fará o trabalho

sed '/^ONE/,/TWO/{/^ONE/!{/TWO/!d}}' file

/^ONE/,/TWO/ Veja a primeira linha que começa com ONE até TWO

{/^ONE/! faça o seguinte se a minha linha não começar com ONE

{/TWO/!d}} faça o seguinte se a minha linha não começar com TWO e delete

Para passar o tempo acima:

Encontre tudo o que começa com ONE até TWO . Outra verificação é executada, o que significa que você encontra tudo o que não corresponde a "ONE and TWO" e exclui o restante.

Espero que ajude

    
por 27.08.2013 / 14:49
2

eu usaria

sed 'N;N;s/ONE.*\n.*TWO/ONE TWO/' file

Observe as duas operações N para unir três linhas juntas para permitir que a opor s funcione.

(isso também se aproxima do seu exemplo original).

    
por 27.08.2013 / 15:34

Tags