Назад | Перейти на главную страницу

Sed или другой скрипт и решение с регулярным выражением для сокращения имени файла

Мне нужно получить 2-3 переменные из имен файлов. Я использую:

FILES=$(ls -tr .../Files/)

for f in $FILES;
    do
......

Файлы выглядят так:

[буквы и / или цифры и (подчеркивание или ничего)] [шестизначное число] [подчеркивание и максимум 6 символов или цифр, или вообще ничего] [.] [расширение]

Мне нужна первая часть [], шесть цифр и знак подчеркивания +, если он существует. Итак, 1. [], 2. [] и 3. [].

Что пробовал:

echo sanyi_123456_m2.txt | sed -e "s/^\(\w{4,40}\)\_?\(\\d{6}\)\_?\(\\w{,6}\)?\(\.\w{2,4}$\)/\\1 \\2 \\3/g"

Что мне от него нужно:

sanyi_ 123456 _m2

Может ли кто-нибудь помочь мне с решением regexp?

большое спасибо

Идеальным решением было следующее:

$ echo sanyi123456_654321_987654.txt | sed -r "s/^([^_]{4,}_?)([0-9]{6})(_(\w{,6}))?\.\w{2,4}$/\1 \2 \4/g"

Это модифицированная версия тех, которые предоставило сообщество, большое за это спасибо. Пока что он работает со следующими (всеми на данный момент) форматами:

karfiol_123123.txt

karfiol_123123_mpf123.txt

karfiol123123.txt

karfiol123123_123123.txt

karfiol123123_123123_123123.txt

karfiol123123_123123_mpf123.txt

karfiol123123_mpf123.txt

еще раз спасибо

Прежде всего, слишком много обратных косых черт. Более того, будучи жадным, ваш первый шарик съест всю строку до точки. Вы можете захотеть прояснить картину, используя расширенные регулярные выражения. Второе подчеркивание зависит от последней части (согласно вашему описанию), оно должно быть заключено в круглые скобки. Четвертый шар (в вашей версии) не нужен.

Что-то вроде этого:

 echo sanyi_123456_m2.txt | sed -r "s/^([a-z]{4,40})_?([0-9]{6})(_(\w{,6}))?\.\w{2,4}$/\1 \2 \4/g"

Вы также можете использовать регулярные выражения Perl там, где возможна не жадная количественная оценка.

Это регулярное выражение выполнит свою работу:

echo "hehehehaha_123456_bc34.meh"|sed 's/\([^_]\+_\?\)\([0-9]\{,6\}\)\(_\w\{,6\}\)\?\..*/\1 \2 \3/'

К сожалению, при использовании sed вам нужно избегать почти всего, отсюда и уродство.