RegEx znajduje i zastępuje sed, dopasowując grupę i zastępując ją pod warunkiem

1

Czy to możliwe z sedem?

Aktualnie jestem w iTunes, używając „Track Name Edit with sed” Skrypty Douga i mam kolekcję utworów zatytułowanych na jeden z dwóch sposobów:

Identical string - Identical string

lub

Some string - some different string

W pierwszym przypadku chcę usunąć jeden z identycznych łańcuchów i środek - więc zostawiam tylko jedną iterację „Identycznego ciągu”. Jeśli łańcuchy są różne (drugi przypadek), chcę zostawić to w spokoju.

próbowałem s/^(.*) - $1/$1/, ale wygląda na to, że nie mogę dopasować się do grupy, którą właśnie zdefiniowałem. s/^(.*) - (.*)/$1/ będzie oczywiście działać w pierwszym przypadku, ale niepoprawnie przetworzy drugi przypadek. Czy jest inny sposób na wykorzystanie tych narzędzi?

NReilingh
źródło
sed zawsze zastępuje pod warunkiem, że pod warunkiem, że pasuje! tak naprawdę nie ma pytania, jak zmusić sed do wymiany pod warunkiem! na pewno nie w takim sensie, że pasuje, co masz na myśli. jeśli spróbowałeś prostszych przykładów, wkrótce zauważyłbyś, że problem polega na tym, że pasuje, gdy uważasz, że nie powinien lub nie pasuje, jeśli uważasz, że powinien.
barlop
Czy masz wersję sed, która używa $ 1? która to wersja? mówisz „s /^(.*) - (. *) / $ 1 / będzie oczywiście działać w pierwszym przypadku”
barlop

Odpowiedzi:

6

ty mogą zdefiniowane grupy referencyjne, ale sed używa \n, nie $n, za to. Ponadto grupowanie z ( ) działa tylko w trybie „rozszerzonym” (włącz za pomocą -r opcja):

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

W trybie „podstawowym” używasz:

sed 's/^\(.*\) - \1/\1/'
grawity
źródło
Druga opcja była dokładnie tym, czego potrzebowałem! Nie dzwonię do sedna z tego Applecript, więc wygląda na to, że działa w trybie podstawowym. Dzięki!
NReilingh
2

to działa, gnuwin32 sed. GNU sed 4.2.1

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

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

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

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

C:\tes>
barlop
źródło