2016-05-06 2 views
0

Мне нужно получить часть имени файла на основе шаблона. Шаблон файла здесь не для проверки того, совпадает ли имя файла с шаблоном. «?» Представляют даты, поэтому они могут быть в формате YYYYMMDD или YYYY-MM-DD, и я не хочу получать даты. Наверное, сейчас я просто попытаюсь получить часть письма до или после части даты на основе шаблона.Как grep часть имени файла с помощью grep или sed на основе шаблона в сценарии оболочки

Например, если шаблон имени файла и фактическое имя файла является:

*_???????? and file name: ab_cd_20160505_efg.txt 

Я хочу Grep строки ab_cd. efg пропущен, потому что он не является частью шаблона.

Если файл шаблон и фактическое имя файла является:

????-??-??_* and file name: 2016-05-05_abc_def-ghi.csv 

(содержит как тир и undercore), я хочу, чтобы Grep строки abc_def-ghi. .csv пропущен, потому что нас не волнует расширение файла, поэтому мы не дали .csv в шаблоне.

Итак, может ли кто-нибудь дать мне знать, как это сделать, используя grep или sed или другую команду в сценарии оболочки?

+2

Я не понимаю правила. –

+0

Я удалил последний пример в сообщении. Наверное, сейчас я просто попытаюсь получить часть письма до или после номерной части. – jlp

+0

Откуда взялся шаблон? Почему 'efg' пропущен в первом примере? Каково правило для символов между вопросительными знаками? Вы запрашиваете какое-то сопоставление из двух строк (шаблон плюс имя файла) в одну строку (ваш вывод), но правила до сих пор не ясны. –

ответ

1

Это в значительной степени так же, как karakfa's answer, но в Bash:

extract() { 
    local pattern="$1" 
    local fname="$2" 
    pattern="${pattern//\?/[[:digit:]]}" 
    pattern="${pattern/\*/([^[:digit:].]+)}" 
    [[ $fname =~ $pattern ]] 
    echo "${BASH_REMATCH[1]}" 
} 

Он использует расширение параметра построить регулярное выражение, заменив все на ? и *, затем сопоставляет имя файла против этого шаблона и печать первой группы захвата.

Например, регулярное выражение генерируется из *_???????? выглядит

([^[:digit:].]+)_[[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]] 

Эта функция может быть использована следующим образом:

$ extract '*_????????' 'ab_cd_20160505_efg.txt'                  
ab_cd 
$ extract '????-??-??_*' '2016-05-05_abc_def-ghi.csv' 
abc_def-ghi 
+0

Спасибо за ваш комментарий. Я попробую это .... – jlp

3

двухэтапный подход

$ pattern=$(sed 's/*/([^0-9.]+)/;s/?/[0-9]/g' <<< '*_????????'); 
$ sed -r "s/$pattern.*/\1/" <<< 'ab_cd_12345678_efg.txt' 
ab_cd 

$ pattern=$(sed 's/*/([^0-9.]+)/;s/?/[0-9]/g' <<< '????-??-??_*'); 
$ sed -r "s/$pattern.*/\1/" <<< '1234-56-78_abc_def-ghi.csv' 
abc_def-ghi 

примечание двойные кавычки во второй sed команды, чтобы Баш расширить картину.

+0

Шаблоны в вопросах также содержат '*', который расширяется до того, что OP хочет извлечь, поэтому, например, в первом случае '_efg.txt' не требуется, а во втором, очевидно, расширение файла не требуется. –

+1

Да, справа обновлен шаблон. – karakfa

+0

Это сработало! Большое спасибо! – jlp

 Смежные вопросы

  • Нет связанных вопросов^_^