Онлайн робочі станції OnWorks Linux та Windows

логотип

Безкоштовний онлайн-хостинг для робочих станцій

<Попередній | зміст | Наступна>

Рядкові операції

Існує великий набір розширень, які можна використовувати для роботи зі струнами. Багато з цих розширень особливо добре підходять для операцій з іменами шляхів.

${#параметр}

розширюється на довжину рядка, що міститься в параметр. Зазвичай, параметр є рядком; однак, якщо параметр є також @ or *, то розширення призводить до кількості позиційних параметрів.



[me@linuxbox ~]$ foo="Цей рядок довгий."

[me@linuxbox ~]$ echo "'$foo' містить ${#foo} символів."

«Цей рядок довгий». має 20 символів.

[me@linuxbox ~]$ foo="Цей рядок довгий."

[me@linuxbox ~]$ echo "'$foo' містить ${#foo} символів."

«Цей рядок довгий». має 20 символів.


${параметр:зсув}

${параметр:зсув: }

Ці розширення використовуються для вилучення частини рядка, що міститься в параметр. Видобуток починається о зсув символів від початку рядка і триває до кінця рядка, якщо не вказано.


[me@linuxbox ~]$ foo="Цей рядок довгий."

[me@linuxbox ~]$ луна ${foo:5}

струна довга.

[me@linuxbox ~]$ луна ${foo:5:6}

рядок

[me@linuxbox ~]$ foo="Цей рядок довгий."

[me@linuxbox ~]$ луна ${foo:5}

струна довга.

[me@linuxbox ~]$ луна ${foo:5:6}

рядок


Якщо значення зсув є негативним, це означає, що воно починається з кінця рядка, а не з початку. Зауважте, що від’ємним значенням має передувати пробіл, щоб уникнути плутанини з ${параметр:-слово} розширення. , якщо є, не повинно бути менше нуля.

If параметр is @, результатом розширення є позиційні параметри, починаючи з

зміщення.



[me@linuxbox ~]$ foo="Цей рядок довгий."

[me@linuxbox ~]$ echo ${foo: -5}

довго.

[me@linuxbox ~]$ echo ${foo: -5:2}

lo

[me@linuxbox ~]$ foo="Цей рядок довгий."

[me@linuxbox ~]$ echo ${foo: -5}

довго.

[me@linuxbox ~]$ echo ${foo: -5:2}

lo


${параметр#модель}

${параметр##модель}

Ці розширення видаляють провідну частину рядка, що міститься в параметр визначені модель. модель є шаблоном підстановки, подібним до тих, що використовуються в розширенні імені шляху. Різниця між цими двома формами полягає в тому, що # форма видаляє найкоротший збіг, тоді як ## форма видаляє найдовший збіг.



[me@linuxbox ~]$ foo=file.txt.zip [me@linuxbox ~]$ луна ${foo#*.} txt.zip

[me@linuxbox ~]$ луна ${foo##*.}

ZIP

[me@linuxbox ~]$ foo=file.txt.zip [me@linuxbox ~]$ луна ${foo#*.} txt.zip

[me@linuxbox ~]$ луна ${foo##*.}

ZIP


${параметр%модель}

${параметр%%модель}

Ці розширення такі ж, як і # та ## розширення вище, за винятком того, що вони видаляють текст з кінця рядка, що міститься в параметр а не з самого початку.



[me@linuxbox ~]$ foo=file.txt.zip

[me@linuxbox ~]$ foo=file.txt.zip


[me@linuxbox ~]$ луна ${foo%.*}

file.txt

[me@linuxbox ~]$ луна ${foo%%.*}

файл

[me@linuxbox ~]$ луна ${foo%.*}

file.txt

[me@linuxbox ~]$ луна ${foo%%.*}

файл


${параметр/модель/рядок}

${параметр//модель/рядок}

${параметр/#модель/рядок}

${параметр/%модель/рядок}

Це розширення виконує пошук і заміну за вмістом параметр. Якщо знайдено текст, що відповідає шаблону модель, його замінено вмістом рядок. У звичайній формі тільки перше поява модель замінюється. В // форму, усі входження замінюються. The /# forma вимагає, щоб збіг відбувався на початку рядка, і /% форма вимагає, щоб відповідність відбувалася в кінці рядка. У кожній формі, /рядок може бути опущено, через що текст відповідає модель для видалення.



[me@linuxbox ~]$ foo=JPG.JPG [me@linuxbox ~]$ відлуння ${foo/JPG/jpg} jpg.JPG

[me@linuxbox ~]$ луна ${foo//JPG/jpg}

jpg.jpg

[me@linuxbox ~]$ луна ${foo/#JPG/jpg}

jpg.JPG

[me@linuxbox ~]$ луна ${foo/%JPG/jpg}

JPG.jpg

[me@linuxbox ~]$ foo=JPG.JPG [me@linuxbox ~]$ відлуння ${foo/JPG/jpg} jpg.JPG

[me@linuxbox ~]$ луна ${foo//JPG/jpg}

jpg.jpg

[me@linuxbox ~]$ луна ${foo/#JPG/jpg}

jpg.JPG

[me@linuxbox ~]$ луна ${foo/%JPG/jpg}

JPG.jpg


Розширення параметрів – це корисно знати. Розширення маніпуляції з рядками можна використовувати як заміну інших поширених команд, наприклад sed та вирізати. Розширення можуть підвищити ефективність сценаріїв, виключивши використання зовнішніх програм. Як приклад, ми змінимо найдовше слово програма, розглянута в попередньому розділі, для використання розширення параметрів ${#j} замість командної заміни $(луна

-n $j | wc -c) та отримана підоболонка, наприклад:


#! / бін / баш

# longest-word3: знайти найдовший рядок у файлі для i; робити

якщо [[ -r $i ]]; тоді max_word= max_len=0

#! / бін / баш

# longest-word3: знайти найдовший рядок у файлі для i; робити

якщо [[ -r $i ]]; тоді max_word= max_len=0


для j в $(рядки $i); робити

len=${#j}

якщо (( len > max_len )); тоді max_len=$len max_word=$j

fi

зроблений

echo "$i: '$max_word' ($max_len символів)"

fi зроблено

для j в $(рядки $i); робити

len=${#j}

якщо (( len > max_len )); тоді max_len=$len max_word=$j

fi

зроблений

echo "$i: '$max_word' ($max_len символів)"

fi зроблено


Далі ми порівняємо ефективність двох версій за допомогою час команда:



[me@linuxbox ~]$ час longest-word2 dirlist-usr-bin.txt

dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символів)

[me@linuxbox ~]$ час longest-word2 dirlist-usr-bin.txt

dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символів)


реальний

користувач

0м3.618с

0м1.544с

реальний

користувач


sys 0m1.768s

[me@linuxbox ~]$ час longest-word3 dirlist-usr-bin.txt

dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символів)

sys 0m1.768s

[me@linuxbox ~]$ час longest-word3 dirlist-usr-bin.txt

dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символів)


реальний

користувач

0м0.060с

0м0.056с

реальний

користувач


sys 0m0.008s

sys 0m0.008s


зображення

Початкова версія скрипту займає 3.618 секунди для сканування текстового файлу, а нова версія, що використовує розширення параметрів, займає лише 0.06 секунди.-дуже значне покращення.


Найпопулярніші хмарні обчислення ОС на OnWorks: