regexp в ksh для расширений tgz, tar.tgz

Да, это - нормальное поведение. Единственное Управление-D обычно только вспыхивает, если это - начало строки. Это выходит с одним Управлением-D:

$ cat > foo.txt
bar
baz
^D
2
21.11.2012, 05:43
3 ответа

[ -f "$myregexp" ] или [[ -f $myregexp ]] тесты, если существует файл, названный точно $myregexp. (Обратите внимание с одиночными скобками, необходимость в двойных кавычках.)

Если Вы хотите протестировать на существование файлов, соответствующих шаблону шарика, нет никакого прямого пути. Необходимо сделать это на двух шагах: сначала генерируйте список соответствий, затем протестируйте, если тот список пуст.

a=( ~(Ni)*.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …

Это использует много ksh-определенных функций:

  • ~(N) префикс для генерации пустого списка, если там не идет ни в какое сравнение;
  • ~(i) префикс, чтобы сделать нечувствительное к регистру соответствие;
  • @(foo|bar) синтаксис шарика для соответствия foo или bar

Вот эквивалентный удар. В ударе Вы получаете случай пустое расширение для несоответствия шарикам и нечувствительности к регистру от опций; extglob для @(foo|bar) синтаксис и другие ksh расширения шарика.

shopt -s nocaseglob nullglob extglob
a=( *.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …

Вот zsh эквивалент. extended_glob опция необходима для (#i) префикс для нечувствительного к регистру соответствия. (N) спецификатор шарика указывает на пустое расширение для несоответствия шарикам.

setopt extended_glob
a=( (#i)*.(tgz|tar.gz)(N) )
if [[ ${#a} -ne 0 ]]; then …
1
27.01.2020, 22:15

Вы, которых пример не дает ключу к разгадке то, что источник Вы сравниваете. Если Вы хотите перечислить файлы в текущем каталоге, можно просто представить некоторые шарики в виде строки вместе как это:

for file in *.tgz *.tar.gz *.TGZ *.TAR.GZ; do
    echo $file
done

Если Вы хотите протестировать имя файла в строке против partern, попробуйте это:

if [[ ( $file =~ .*\.(tgz|TGZ|tar\.gz|TAR\.GZ) ) ]]; then
    echo $file
fi

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

case $file in
    *.tgz|*.tar.gz|*.TGZ|*.TAR.GZ)
        echo $file
        ;;
esac
1
27.01.2020, 22:15

Можно даже сделать нечувствительное к регистру соответствие простым выражениям шарика:

for f in *.[Tt][Gg][Zz] *.[Tt][Aa][Rr].[Gg][Zz]; do
   echo $f
done
0
27.01.2020, 22:15

Теги

Похожие вопросы