KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Мендель Купер - Искусство программирования на языке сценариев командной оболочки

Мендель Купер - Искусство программирования на языке сценариев командной оболочки

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Мендель Купер, "Искусство программирования на языке сценариев командной оболочки" бесплатно, без регистрации.
Перейти на страницу:

echo `expr index "$stringZ" C12` # 6

# позиция символа C.


echo `expr index "$stringZ" 1c` # 3

# символ 'c' (в #3 позиции) совпал раньше, чем '1'.


Эта функция довольно близка к функции strchr() в языке C.

Извлечение подстроки

${string:position}

Извлекает подстроку из $string, начиная с позиции $position.

Если строка $string -- "*" или "@", то извлекается позиционный параметр (аргумент)[ 21 ], с номером $position.

${string:position:length}

Извлекает $length символов из $string, начиная с позиции $position.

stringZ=abcABC123ABCabc

# 0123456789.....

# Индексация начинается с 0.


echo ${stringZ:0} # abcABC123ABCabc

echo ${stringZ:1} # bcABC123ABCabc

echo ${stringZ:7} # 23ABCabc


echo ${stringZ:7:3} # 23A

# Извлекает 3 символа.


# Возможна ли индексация с "правой" стороны строки?


echo ${stringZ:-4} # abcABC123ABCabc

# По-умолчанию выводится полная строка.

# Однако . . .


echo ${stringZ:(-4)} # Cabc

echo ${stringZ: -4} # Cabc

# Теперь выводится правильно.

# Круглые скобки или дополнительный пробел "экранируют" параметр позиции.


# Спасибо Dan Jacobson, за разъяснения.


Если $string -- "*" или "@", то извлекается до $length позиционных параметров (аргументов), начиная с $position.

echo ${*:2} # Вывод 2-го и последующих аргументов.

echo ${@:2} # То же самое.


echo ${*:2:3} # Вывод 3-х аргументов, начиная со 2-го.


expr substr $string $position $length

Извлекает $length символов из $string, начиная с позиции $position.

stringZ=abcABC123ABCabc

# 123456789......

# Индексация начинается с 1.


echo `expr substr $stringZ 1 2` # ab

echo `expr substr $stringZ 4 3` # ABC


expr match "$string" '($substring)'

Находит и извлекает первое совпадение $substring в $string, где $substring -- это регулярное выражение.

expr "$string" : '($substring)'

Находит и извлекает первое совпадение $substring в $string, где $substring -- это регулярное выражение.

stringZ=abcABC123ABCabc

# =======


echo `expr match "$stringZ" '(.[b-c]*[A-Z]..[0-9])'` # abcABC1

echo `expr "$stringZ" : '(.[b-c]*[A-Z]..[0-9])'` # abcABC1

echo `expr "$stringZ" : '(.......)'` # abcABC1

# Все вышеприведенные операции дают один и тот же результат.


expr match "$string" '.*($substring)'

Находит и извлекает первое совпадение $substring в $string, где $substring -- это регулярное выражение. Поиск начинается с конца $string.

expr "$string" : '.*($substring)'

Находит и извлекает первое совпадение $substring в $string, где $substring -- это регулярное выражение. Поиск начинается с конца $string.

stringZ=abcABC123ABCabc

# ======


echo `expr match "$stringZ" '.*([A-C][A-C][A-C][a-c]*)'` # ABCabc

echo `expr "$stringZ" : '.*(......)'` # ABCabc


Удаление части строки

${string#substring}

Удаление самой короткой, из найденных, подстроки $substring в строке $string. Поиск ведется с начала строки

${string##substring}

Удаление самой длинной, из найденных, подстроки $substring в строке $string. Поиск ведется с начала строки

stringZ=abcABC123ABCabc

# |----|

# |----------|


echo ${stringZ#a*C} # 123ABCabc

# Удаление самой короткой подстроки.


echo ${stringZ##a*C} # abc

# Удаление самой длинной подстроки.


${string%substring}

Удаление самой короткой, из найденных, подстроки $substring в строке $string. Поиск ведется с конца строки

${string%%substring}

Удаление самой длинной, из найденных, подстроки $substring в строке $string. Поиск ведется с конца строки

stringZ=abcABC123ABCabc

# ||

# |------------|


echo ${stringZ%b*c} # abcABC123ABCa

# Удаляется самое короткое совпадение. Поиск ведется с конца $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

# Обратите внимание на различия в индексации:

# Bash начинает индексацию с '0'.

# Awk начинает индексацию с '1'.


echo ${String:2:4} # с 3 позиции (0-1-2), 4 символа

# skid


# В эквивалент в awk: substr(string,pos,length).

echo | awk '

{ print substr("'"${String}"'",3,4) # skid

}

'

# Передача пустого "echo" по каналу в awk, означает фиктивный ввод,

#+ делая, тем самым, ненужным предоставление имени файла.


exit 0


9.2.2. Дальнейшее обсуждение

Дополнительную информацию, по работе со строками, вы найдете в разделе Section 9.3 и в секции, посвященной команде expr. Примеры сценариев:

1. Пример 12-6

2. Пример 9-15

3. Пример 9-16

4. Пример 9-17

5. Пример 9-19


9.3. Подстановка параметров

Работа с переменными и/или подстановка их значений

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*