# Удаляется самое короткое совпадение. Поиск ведется с конца $stringZ.
echo ${stringZ%%b*c} # a
# Удаляется самое длинное совпадение. Поиск ведется с конца $stringZ.
Пример 9-11. Преобразование графических файлов из одного формата в другой, с изменением имени файла
#!/bin/bash
# cvt.sh:
# Преобразование всех файлов в заданном каталоге,
#+ из графического формата MacPaint, в формат "pbm".
# Используется утилита "macptopbm", входящая в состав пакета "netpbm",
#+ который сопровождается Brian Henderson ([email protected]).
# Netpbm -- стандартный пакет для большинства дистрибутивов Linux.
OPERATION=macptopbm
SUFFIX=pbm # Новое расширение файла.
if [ -n "$1" ]
then
directory=$1 # Если каталог задан в командной строке при вызове сценария
else
directory=$PWD # Иначе просматривается текущий каталог.
fi
# Все файлы в каталоге, имеющие расширение ".mac", считаются файлами
#+ формата MacPaint.
for file in $directory/* # Подстановка имен файлов.
do
filename=${file%.*c} # Удалить расширение ".mac" из имени файла
#+ ( с шаблоном '.*c' совпадают все подстроки
#+ начинающиеся с '.' и заканчивающиеся 'c',
$OPERATION $file > "$filename.$SUFFIX"
# Преобразование с перенаправлением в файл с новым именем
rm -f $file # Удаление оригинального файла после преобразования.
echo "$filename.$SUFFIX" # Вывод на stdout.
done
exit 0
# Упражнение:
# --------
# Сейчас этот сценарий конвертирует *все* файлы в каталоге
# Измените его так, чтобы он конвертировал *только* те файлы,
#+ которые имеют расширение ".mac".
Замена подстроки
${string/substring/replacement}
Замещает первое вхождение $substring строкой $replacement.
${string//substring/replacement}
Замещает все вхождения $substring строкой $replacement.
stringZ=abcABC123ABCabc
echo ${stringZ/abc/xyz} # xyzABC123ABCabc
# Замена первой подстроки 'abc' строкой 'xyz'.
echo ${stringZ//abc/xyz} # xyzABC123ABCxyz
# Замена всех подстрок 'abc' строкой 'xyz'.
${string/#substring/replacement}
Подстановка строки $replacement вместо $substring. Поиск ведется с начала строки $string.
${string/%substring/replacement}
Подстановка строки $replacement вместо $substring. Поиск ведется с конца строки $string.
stringZ=abcABC123ABCabc
echo ${stringZ/#abc/XYZ} # XYZABC123ABCabc
# Поиск ведется с начала строки
echo ${stringZ/%abc/XYZ} # abcABC123ABCXYZ
# Поиск ведется с конца строки
9.2.1. Использование awk при работе со строками
В качестве альтернативы, Bash-скрипты могут использовать средства awk при работе со строками.
Пример 9-12. Альтернативный способ извлечения подстрок
#!/bin/bash
# substring-extraction.sh
String=23skidoo1
# 012345678 Bash
# 123456789 awk
# Обратите внимание на различия в индексации: