У меня есть несколько файлов в каталоге с именем edit_file_names.sh
, каждый из которых содержит ?
в своем имени. Я хочу использовать сценарий Bash для сокращения имен файлов прямо перед ?
. Например, это будут мои текущие имена файлов:
test.file.1?twagdsfdsfdg
test.file.2?
test.file.3?.?
И это будут мои желаемые имена файлов после запуска скрипта:
test.file.1
test.file.2
test.file.3
Однако я не могу зафиксировать начало имен файлов в моем регулярном выражении, чтобы использовать их при переименовании файлов. Вот мой текущий сценарий:
#!/bin/bash
cd test_file_name_edit/
regex="(^[^\?]*)"
for filename in *; do
$filename =~ $regex
echo ${BASH_REMATCH[1]}
done
На этом этапе я просто пытаюсь распечатать начало каждого имени файла, чтобы знать, что я захватываю правильную строку, однако я получаю следующую ошибку:
./edit_file_names.sh: line 7: test.file.1?twagdsfdsfdg: command not found
./edit_file_names.sh: line 7: test.file.2?: command not found
./edit_file_names.sh: line 7: test.file.3?.?: command not found
Как я могу исправить свой код, чтобы успешно зафиксировать начало этих имен файлов?
2 ответа
Регулярное выражение как таковое может быть не лучшим инструментом для этой работы. Вместо этого я бы предложил использовать расширение параметра bash а>. Например:
#!/bin/bash
files=(test.file.1?twagdsfdsfdg test.file.2? test.file.3?.?)
for f in "${files[@]}"; do
echo "${f} shortens to ${f%%\?*}"
done
Какие отпечатки
test.file.1?twagdsfdsfdg shortens to test.file.1
test.file.2? shortens to test.file.2
test.file.3?.? shortens to test.file.3
Здесь ${f%%\?*}
расширяет f
и обрезает самый длинный суффикс, который соответствует ?
, за которым следуют любые символы (?
необходимо экранировать, поскольку это подстановочный знак).
Вы пропустили тестовую команду [[ ]]
:
for filename in *; do
[[ $filename =~ $regex ]] && echo ${BASH_REMATCH[1]}
done
Похожие вопросы
Новые вопросы
regex
Регулярные выражения предоставляют декларативный язык для сопоставления шаблонов в строках. Они обычно используются для проверки, синтаксического анализа и преобразования строк. Поскольку регулярные выражения не полностью стандартизированы, все вопросы с этим тегом должны также включать тег, определяющий применимый язык программирования или инструмент.