Como usar o sed para substituir duas instâncias dos mesmos dígitos separadas por uma barra com uma instância desses dígitos?

4

Eu quero usar sed para substituir duas instâncias dos mesmos dígitos separadas por uma barra com uma instância desses dígitos. Meus arquivos de entrada têm linhas como esta:

text (1982/1982) text
text (1983/1983) text
text (1984/1984) text

Eu quero uma saída assim:

text (1982) text
text (1983) text
text (1984) text

Eu tenho que combinar os parênteses porque pode haver outras seqüências de dígitos separados por uma barra nos arquivos de entrada.

Em BBEdit , posso fazer isso com o padrão de pesquisa \(([0-9]{4})/\) e o padrão de substituição \(\) . Mas em sed as expressões regulares estendidas equivalentes parecem não funcionar:

echo 'text (1984/1984) text' | sed -E 's_\(([0-9]{4})/\)_\(\)_g'

retorna:

text (1984/1984) text

mas em vez disso eu quero:

text (1984) text

Quais são as expressões regulares estendidas que farão isso em sed ?

Estou usando o sed integrado no macOS.

    
por Big Mac 22.07.2018 / 22:25

1 resposta

4

A versão do sed do OSX é muito chata (na verdade é a versão do BSD). Eu costumo instalar o sed do GNU via brew:

$ brew search sed
==> Formulae
gnu-sed ✔             libxdg-basedir        minised               ssed

==> Casks
eclipse-dsl                                  marsedit
exoduseden                                   microsoft-bing-ads-editor
focused                                      osxfuse-dev
google-adwords-editor                        physicseditor
lego-mindstorms-education-ev3                prefs-editor
licensed                                     subclassed-mnemosyne

Instale:

$ brew install gnu-sed

Você pode usá-lo da seguinte forma:

$ gsed ....

E voila, o seu exemplo agora funciona:

$ echo 'text (1984/1984) text' | sed -E 's_\(([0-9]{4})/\)_\(\)_g'
text (1984/1984) text
$ echo 'text (1984/1984) text' | gsed -E 's_\(([0-9]{4})/\)_\(\)_g'
text (1984) text

Referências

por 22.07.2018 / 23:15