1

Возможно ли это с помощью sed?

Я на самом деле в iTunes, использую "Track Name Edit with sed" из сценария Дага, и у меня есть коллекция треков, которые названы одним из двух способов:

Identical string - Identical string

или же

Some string - some different string

В первом случае я хочу удалить одну из идентичных строк и середину - так что мне остается только одна итерация «Идентичной строки». Если строки разные (второй случай), я хочу оставить это в покое.

Я попытался s/^(.*) - $1/$1/ , но, похоже, я не могу найти группу, которую только что определил. s/^(.*) - (.*)/$1/ будет работать для первого случая, очевидно, но будет некорректно обрабатывать для второго случая. Есть ли другой способ обойти это с помощью инструментов, которые я упомянул?

2 ответа2

6

Вы можете ссылаться на группы, которые вы только что определили, но sed использует для этого \n , а не $n . Кроме того, группировка с помощью ( ) работает только в "расширенном" режиме (включите с помощью опции -r):

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

В "основном" режиме вы бы использовали:

sed 's/^\(.*\) - \1/\1/'
2

это работает, gnuwin32 сед. 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>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .