LinuxForum.Fans
Тема

Поиск по шаблону и sed

Автор: Gam 9 сообщений 2752 просмотров
#237152

Собственно сам вопрос: есть файл типа (C81)(яп.символы)(яп.символы)[DDBY] Relax Piano (tta+cue)
Нужно переделать в: DDBY - Relax Piano

Если с "вырыванием" Relax Piano ещё можно как то справится то на DDBY у меня ступор:
Пример до чего я додумался (естественно потом строки объединю):

text

#!/bin/sh
IFS="
" #"Отзерказываем" пробел
for fm in `ls`; #Перечисляем файлы в папке
  do 
rk=`echo "$fm" | sed 's/*[^[\]\]*$//;s/[[^*]//;s/\][^*]*$//;'`
echo "$rk"
done

Как убрать начало мозги уже не варят...
man по sed читал - что-то понял, что-то нет...

#237153

[console]echo '(C81)(яп.символы)(яп.символы)[DDBY] Relax Piano (tta+cue)' | sed 's=^(.*)(.*)(.*)\[\(.*\)\] \(.*\) (.*)=\1 - \2='
DDBY - Relax Piano[/console]

#237154

Fat-Zer, а если допустим там будет не 3 круглых скобок, а несколько?
Можно задать вырезание текста до квадратных скобок?
Просто проблема в том что неизвестно сколько там будет круглых скобок перед квадратными.
Известно точно что будет конструкция вида: бла-бла-бла...[Название группы] Название альбома...бла-бла-бла
За пример благодарю.

Вопрос решил)
[console]sed 's=^.*\[\(.*\)\] \(.*\) (.*)=\1 - \2='[/console]
Большое спасибо)

#237173
Gam написал:
Если с "вырыванием" Relax Piano ещё можно как то справится то на DDBY у меня ступор:
Пример до чего я додумался (естественно потом строки объединю):
Gam написал:
rk=`echo "$fm" | sed 's/*[^[\]\]*$//;s/[[^*]//;s/\][^*]*$//;'`

[DDBY] это нечто в квадратных скобках? Тогда оно выдирается так
[console]$ echo "(C81)(яп.символы)(яп.символы)[DDBY] Relax Piano (tta+cue)" | sed -r 's/.*(\[[^]]*\]).*/\1/'
[DDBY]
[/console]
нужно помнить, что ] надо экранировать в общем случае, но внутри [] экранировать НЕ нужно. Однако ] нужно ставить либо сразу после [, либо сразу после ^, если он используется как инверсия. С учётом этого любой символ кроме ] записывается [^]], а любой символ кроме ], a, b, или c записывается как [^]abc], но НЕ как [^ab]c] и не как [^abc]]

#237175
Gam написал:
sed 's=^.*\[\(.*\)\] \(.*\) (.*)=\1 - \2='
Gam написал:
Вопрос решил)

вы точно ЭТОГО хотели?
[console]$ echo "(C81)(яп.символы)(яп.символы)[DDBY] Rela[x] Piano (tta+cue)" | sed 's=^.*\[\(.*\)\] \(.*\) (.*)=\1 - \2='
x - Piano
[/console]

#237546

Хм...однако....

Может как то запретить реагировать на квадратные скобки в названии альбома?
Допустим убрать все символы до первой квадратной скобки, выбрать все символы в первых квадратных скобках, после этого скобки игнорировать и обработать оставшие символы до последних круглых скобок.
Как я понимаю простым экранированием тут не добиться...К тому же точно неизвестно будут ли скобки в названии или нет.

благодарю за объяснение

#237555

Gam, во первых первая звёздочка жадная, и жрёт ВСЁ, что сможет. В том числе и первое выражение [в скобках], во вторых в вашем условии не указано, что внутри скобок не может быть скобок. потому [x] xxxxxxxxxxxxxxxxxxxxxxxxxx [x] ваша регулярка воспринимает как ОДНО выражение в скобках.

#237564

Печально, будем думать и юзать гугл дальше.
И последний вопрос (если я ещё не сильно утомил): с помощью чего можно задать проверку имён файлов (а точнее расположение скобок) по шаблонам?
Что бы для каждого типа задать свой шаблон переименования.

Войдите или зарегистрируйтесь, чтобы ответить.