Ajuda sobre o comando sed

1

Um livro do Linux que cobre o comando sed me dá um exemplo da seguinte forma:

sed -e 's/\(<[^ ]*>\)\([ ]*\)\(<[^ ]*>\)//g'
GNU Linux is cool
Linux GNU cool is 

mas enquanto eu digito exatamente o mesmo comando que o próximo, ele me mostra:

sed -e 's/\(<[^ ]*>\)\([ ]*\)\(<[^ ]*>\)//g'
GNU Linux is cool
GNU Linux is cool

Alguém pode me ajudar a resolver isso? Estou usando o Ubuntu 12.04LTS. Muito obrigado.

    
por jswxy1 15.03.2014 / 11:06

2 respostas

3

Pode ser apenas um problema com a formatação do fórum, mas o < e > são presumivelmente destinados a ser âncoras de palavras e, como tal, precisam de escapes de contrabarra \< e \>

sed -e 's/\(\<[^ ]*\>\)\([ ]*\)\(\<[^ ]*\>\)//g'

i.e.

echo 'GNU Linux is cool'| sed -e 's/\(\<[^ ]*\>\)\([ ]*\)\(\<[^ ]*\>\)//g'
Linux GNU cool is

No entanto, como os pôsteres anteriores, eu também sugeriria usar o formulário estendido do GNU -r para reduzir o número de escapes

sed -re 's/(\<[^ ]*\>)([ ]*)(\<[^ ]*\>)//g'

As âncoras de palavra não parecem ser necessárias se você alterar o * (zero ou mais) para + (um ou mais)

echo 'GNU Linux is cool'| sed -re 's/([^ ]+)([ ]+)([^ ]+)//g'
Linux GNU cool is
    
por steeldriver 15.03.2014 / 11:47
1

Bem, eu não sei. Houve alguns problemas aqui:

  • Você precisa ativar o modo estendido para essas correspondências ( -r )
  • Você não precisa do modo de script em ( -e ), mas isso não foi um erro
  • Houve muitos escapes de colchetes que estavam sintaticamente incorretos (você precisava deles para corresponder)
  • Eu não consegui descobrir o que eram os colchetes angulares. Então eu os derrubei.
  • O modo global /g o quebra porque troca as últimas três palavras e quebra o espaço. Experimente se quiser.

E aqui está funcionando:

$ echo "GNU Linux is cool" | sed -r "s/([^ ]*)([ ]*)([^ ]*)//"
Linux GNU is cool

Uma maneira melhor / mais curta / mais fácil de ler para fazer isso seria a de neutralizar o segundo grupo e usar apenas um espaço literal. Assim:

$ echo "GNU Linux is cool" | sed -r "s/([^ ]*) ([^ ]*)/ /"
Linux GNU is cool
    
por Oli 15.03.2014 / 11:27