retirando os dois últimos [end] com sed?

2

Estou trabalhando em um script que melhora o fluxbox 'menu' e meu script tem esta linha:

sed -i 's/\[end]//g' ~/.fluxbox/menu;sed -i '/^\s*$/d' ~/.fluxbox/menu

mas isto tem o infeliz efeito de remover all do [end] que é ruim, eu só quero que ele remova as duas últimas ocorrências de [end] nesse arquivo. Então, como faço isso, por favor?

    
por boudiccas 22.11.2013 / 15:59

2 respostas

2

O mais fácil é provavelmente usar o modo slurp de perl :

perl -0777 -pi -e 's/(.*)\[end]/$1/s;s/(.*)\[end]/$1/s;s/^\s*\n//gm' ~/.fluxbox/menu
    
por 22.11.2013 / 16:19
1

Similar ao modo slurp perl sed pode ler o arquivo inteiro no buffer de armazenamento ("espaço reservado") para que o conteúdo do arquivo possa ser tratado como uma única linha em "espaço padrão" (para mais informações, consulte sed e Multi-Line Search and Replace ).

Tendo apenas uma única linha grande, a natureza gananciosa das expressões regulares sed facilita a remoção das duas últimas ocorrências de [end] no arquivo fornecido (praticamente idêntica à lógica regex Perl de solução aceita por Stephane Chazelas ).

#sed -i -n -e '1h;1!H;${;g; s/\(.*\)\[end\]//; s/\(.*\)\[end\]//; p;}'  file  # does not work on Mac OS X 10.6.8
sed -n -i -e '1h;1!H;${;g; s/\(.*\)\[end\]//; s/\(.*\)\[end\]//; p;}' file   # note: -n precedes -i

# ... plus deleting all blank lines
sed -n -i -e '1h;1!H;${;g; s/\(.*\)\[end\]//; s/\(.*\)\[end\]//; s/^[[:space:]]*\n//; s/\n[[:space:]]*$//; s/\n[[:space:]]*\n/\
/g; p;}' file
    
por 22.11.2013 / 20:01