Команда vi
% s / \ ([az] \ ), \ ([AZ] \) / \ 1 \ 2 / g
изменит
y,S
T,d
5,e
на
y S
T,d
5,e
В оболочках, совместимых с SH, существует так называемая переменная IFS. IFS расшифровывается как Внутренний разделитель полей . Эта переменная управляет тем, как оболочка определяет границы параметров, например, в позиционных аргументах.
По умолчанию:
set IFS=$' \t\n'
Что переводится как :разделить ввод на токены, разделенные пробелом, табуляцией и новой строкой.
Ваши файлы состоят из пробелов. Попробуйте сделать это так:
OLD_IF="$IFS"
IFS=$'\t\n'
for file in `ls -1` ; do
# Content of your loop
done
IFS="$OLD_IFS"
Здесь загвоздка в том, чтобы сохранить предыдущее значение IFS и восстановить его.
Редактировать :добавлено ls -1
, так как в этом списке по одному файлу в строке, следовательно, выполняется то, что вы упомянули.
Ваша функция анализирует вывод ls
без кавычек. Это означает, что оболочка будет выполнять разбиение слов (по умолчанию для любых пробелов )и генерацию имени файла (подстановку )на выходе ls
.
Вместо:
dirwalk () {
indent=${1:-0}
for name in *; do
[ ! -e "$name" ] && continue
if [ -d "$name" ]; then
printf '%*sDir: "%s"\n' "$indent" "" "$name"
( cd "$name" && dirwalk "$(( indent + 4 ))" )
else
printf '%*sFile: "%s"\n' "$indent" "" "$name"
fi
done
}
или, без причудливого отступа,
dirwalk () {
for name in *; do
[ ! -e "$name" ] && continue
if [ -d "$name" ]; then
printf 'Dir: "%s"\n' "$name"
( cd "$name" && dirwalk )
else
printf 'File: "%s"\n' "$name"
fi
done
}
Используя *
вместо вывода ls
, мы создаем правильно разделенный список имен файлов для повторения в текущем каталоге, даже если они содержат пробелы.
Тест -e
должен убедиться, что то, что мы повторяем, действительно существует. Если мы войдем в пустой каталог, *
не будет расширяться и останется как *
. В bash
вы можете установить параметр оболочки nullglob
(с помощью shopt -s nullglob
), чтобы вместо этого непревзойденные шаблоны расширялись до нуля.
При использовании cd
в подоболочке (в круглых скобках )нам не нужно помнить cd..
, чтобы вернуться в предыдущий каталог. Окружающая среда за пределами (... )
не будет затронута cd
внутри него.
Используя printf
вместо echo
, мы лучше контролируем форматирование вывода. Также см. «Почему printf лучше, чем echo? ».