RegEx localizar e substituir por sed, grupo correspondente e substituição por condição

1

Isso é possível com sed?

Na verdade, estou no iTunes usando o "Track Name Edit com sed" do Scripts do Doug , e eu tenho uma coleção de faixas que são intituladas de duas maneiras:

Identical string - Identical string

ou

Some string - some different string

No primeiro caso, eu quero remover uma das strings idênticas e o meio - , então fico com apenas uma iteração da "string idêntica". Se as sequências forem diferentes (segundo caso), quero deixar sozinho.

Eu tentei s/^(.*) - $1/$1/ , mas parece que não consigo corresponder a um grupo que acabei de definir. s/^(.*) - (.*)/$1/ funcionará para o primeiro caso, obviamente, mas processará incorretamente para o segundo caso. Existe outra maneira de contornar isso usando as ferramentas que mencionei?

    
por NReilingh 17.09.2011 / 21:51

2 respostas

6

Você pode fazer referência a grupos que acabou de definir, mas sed usa \n , não $n , para isso. Além disso, o agrupamento com ( ) funciona apenas no modo "estendido" (ativar com a opção -r ):

sed -r 's/^(.+) - //'

No modo "básico", você usaria:

sed 's/^\(.*\) - //'
    
por 17.09.2011 / 22:08
2

isso funciona, gnuwin32 sed. GNU sed 4.2.1

C:\tes>echo ident - ident | sed -r "s/^(.*) -  /z/"
z

C:\tes>echo ident - idrnt | sed -r "s/^(.*) -  /z/"
ident - idrnt

C:\tes>echo ident - ident | sed -r "s/^(.*) -  //"
ident

C:\tes>echo ident - idevt | sed -r "s/^(.*) -  //"
ident - idevt

C:\tes>
    
por 17.09.2011 / 22:12