2

Пожалуйста, смотрите следующую функцию -

function touchm(){
    date=$(date +'%Y-%m-%d %H:%M:%S')
    read Y M D h m s <<< ${date//[-: ]/ }
    file_name=$1

    if [[ $file_name =~ ^[0-9a-zA-Z+_-]+.[py|pl|rb|sh] ]]; then
        echo "#
# $file_name
#
# Created by $MASTER on $M/$D/$Y at $h:$m:$s
# Copyright (c) $Y $MASTER. All rights reserved.
#
" > $1

    elif [[ $file_name =~ ^[0-9a-zA-Z+_-]+.[m|h|c|cpp|] ]]; then
        echo "//
// $file_name
//
// Created by $MASTER on $M/$D/$Y at $h:$m:$s
// Copyright (c) $Y $MASTER. All rights reserved.
//
" > $1

    elif [[ $file_name =~ ^[0-9a-zA-Z+_-]+.[ml] ]]; then
        echo "(* *)
(* $file_name *)
(* *)
(* Created by $MASTER on $M/$D/$Y at $h:$m:$s *)
(* Copyright (c) $Y $MASTER. All rights reserved. *)
(* *)
" > $1

    else
        echo "What bullshit. Give me a good file name"

    fi
}

поэтому всякий раз, когда я выполняю:

touchm 2-r_f.ml

это должно сгенерировать файл ml с комментариями типа ml. Но это не так. Он генерирует комментарии типа c.

Более того, мне нужно учесть и +, и _ (подчеркивание), но в настоящее время это, похоже, не работает. Это плохое регулярное выражение? Если да, могу ли я получить указатели, чтобы исправить это?

Спасибо

1 ответ1

1

Вместо этого вы можете попробовать использовать cat, т.е.

cat << EOF> output-filename
# $ file_name
#
# Создано $ MASTER для $ M/$ D/$ Y в $ h:$ m:$ s
# Авторское право (c) $ Y $ MASTER. Все права защищены.
#
EOF

Если вы хотите сделать отступ для кода выше, измените << на << -, чтобы удалить ведущие вкладки.

Кроме того, да, это плохое регулярное выражение. классы символов (квадратные скобки) не нуждаются в каналах, то есть для альтернативных совпадений внутри круглых скобок. Вы хотите что-то вроде:
Замените: $ file_name = ~ ^ [0-9 | az | AZ | -] . [Ml]
С помощью: $ file_name = ~ ^ [0-9a-zA-Z+_-]
. [ Ml ]

Вы также можете заменить * на +, чтобы указать 1 или более, так как это регулярное выражение также будет соответствовать '.ml'. Убедитесь, что дефис является последним символом в классе символов, в противном случае он будет предполагать, что вы указываете диапазон.

РЕДАКТИРОВАТЬ: попробуйте это, только что протестировано с файлами .sh, .cpp и .ml. Из любопытства, 3-й оператор if должен быть для .ml или .m ИЛИ .l, как вы, кажется, подходите? второй оператор if также соответствует .m, поэтому один из них, вероятно, неверен, в приведенном ниже коде предполагается, что третий оператор if должен быть .ml

function touchm(){
    date=$(date +'%Y-%m-%d %H:%M:%S')
    read Y M D h m s <<< ${date//[-: ]/ }
    file_name=$1

    if [[ $file_name =~ ^[0-9a-zA-Z+_-]+\.(py|pl|rb|sh)$ ]]; then
        echo "\#
# $file_name
#
# Created by $MASTER on $M/$D/$Y at $h:$m:$s
# Copyright (c) $Y $MASTER. All rights reserved.
#
" > $1

    elif [[ $file_name =~ ^[0-9a-zA-Z+_-]+\.(m|h|c|cpp)$ ]]; then
        echo "//
// $file_name
//
// Created by $MASTER on $M/$D/$Y at $h:$m:$s
// Copyright (c) $Y $MASTER. All rights reserved.
//
" > $1

    elif [[ $file_name =~ ^[0-9a-zA-Z+_-]+\.ml$ ]]; then
        echo "(* *)
(* $file_name *)
(* *)
(* Created by $MASTER on $M/$D/$Y at $h:$m:$s *)
(* Copyright (c) $Y $MASTER. All rights reserved. *)
(* *)
" > $1

    else
        echo "What bullshit. Give me a good file name"

    fi
}

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