Основные операции со строками

ShellBeginner
Практиковаться сейчас

Введение

В ходе этой лабораторной работы вы познакомитесь с фундаментальными операциями над строками в shell-скриптах. Работа со строками критически важна для манипулирования данными и извлечения информации из текста при автоматизации различных задач. Вы изучите такие концепции, как определение длины строки, поиск позиции символа, извлечение подстрок и замена фрагментов текста. Эти навыки необходимы для эффективной обработки текстовых данных в сценариях командной оболочки.

Краткий справочник

Ниже приведен обзор строковых операций, которые мы рассмотрим в этой работе:

Операция Синтаксис Описание Пример
Длина строки ${#string} Вычисляет количество символов в строке ${#"hello"} вернет 5
Поиск позиции символа $(expr index "$string" "$char") Находит позицию символа в строке (индексация с 1) $(expr index "abcdef" "c") вернет 3
Извлечение подстроки ${string:start:length} Извлекает часть строки (индексация с 0) ${"hello":1:3} вернет ell
Замена первого вхождения ${string/pattern/replacement} Заменяет первое совпадение с шаблоном ${"hello"/l/L} вернет heLlo
Замена всех вхождений ${string//pattern/replacement} Заменяет все совпадения с шаблоном ${"hello"//l/L} вернет heLLo
Замена в начале ${string/#pattern/replacement} Заменяет шаблон, только если он в начале строки ${"hello"/#he/HE} вернет HEllo
Замена в конце ${string/%pattern/replacement} Заменяет шаблон, только если он в конце строки ${"hello"/%lo/LO} вернет helLO

Создание файла скрипта

Начнем с создания файла скрипта, в котором мы будем писать наши операции со строками.

  1. Откройте терминал в WebIDE. Терминал — это место, где вы вводите команды для взаимодействия с системой Linux.

  2. Перейдите в каталог проекта:

    cd ~/project

    Эта команда меняет текущий рабочий каталог на ~/project. Символ ~ обозначает ваш домашний каталог, поэтому ~/project — это папка с именем "project" в вашем домашнем каталоге.

  3. Создайте новый файл с именем string_operations.sh:

    touch string_operations.sh

    Команда touch создает новый пустой файл. Если файл уже существует, она просто обновляет метку времени файла.

  4. Откройте файл в редакторе WebIDE. Вы можете сделать это, щелкнув по имени файла в проводнике слева.

  5. Добавьте следующую строку "shebang" в самое начало файла, чтобы указать интерпретатор:

    #!/bin/bash

    Эта строка, называемая "shebang", сообщает системе, что для интерпретации этого скрипта нужно использовать оболочку Bash. Это всегда должна быть первая строка в shell-скрипте.

Длина строки

Теперь давайте научимся определять длину строки.

  1. Добавьте следующий код в файл string_operations.sh:

    echo "Step 2: String Length"
    
    STRING="Hello, World!"
    LENGTH=${#STRING}
    
    echo "The string is: $STRING"
    echo "Its length is: $LENGTH"

    Разберем этот код пошагово:

    • Сначала мы используем команду echo для вывода заголовка этого раздела.

      echo "Step 2: String Length"
    • Затем мы определяем переменную STRING и присваиваем ей значение "Hello, World!".

      STRING="Hello, World!"

      В Bash не нужно использовать специальные ключевые слова для определения переменных. Мы просто пишем имя переменной, затем знак равенства и значение.

    • Далее мы вычисляем длину строки, используя синтаксис ${#variable}, и сохраняем результат в переменную LENGTH.

      LENGTH=${#STRING}

      Конструкция ${#variable} — это специальное расширение параметров оболочки, которое возвращает количество символов в строке, хранящейся в переменной.

    • Наконец, мы выводим на экран исходную строку и её длину.

      echo "The string is: $STRING"
      echo "Its length is: $LENGTH"

      Символ $ перед именем переменной указывает Bash заменить его значением этой переменной.

  2. Сохраните файл. В большинстве редакторов это можно сделать нажатием Ctrl+S (или Cmd+S на Mac).

  3. Сделайте скрипт исполняемым:

    chmod +x string_operations.sh

    Эта команда изменяет права доступа к файлу, чтобы его можно было запустить:

    • chmod означает "change mode" (изменить режим)
    • +x означает "add execute permission" (добавить право на выполнение)
    • Без этого шага система не будет знать, что этот файл следует рассматривать как программу.
  4. Запустите скрипт:

    ./string_operations.sh

    Префикс ./ указывает оболочке искать скрипт в текущем каталоге. Без него оболочка искала бы файл только в каталогах, перечисленных в переменной окружения PATH.

Вы должны увидеть вывод, похожий на этот:

Step 2: String Length
The string is: Hello, World!
Its length is: 13

Если вы не видите этого вывода, убедитесь, что вы сохранили файл и сделали его исполняемым.

Поиск позиции символа

Далее мы научимся находить позицию конкретного символа в строке.

  1. Добавьте следующий код в файл string_operations.sh:

    echo -e "\nStep 3: Finding Character Position"
    
    STRING="abcdefghijklmnopqrstuvwxyz"
    CHAR="j"
    
    POSITION=$(expr index "$STRING" "$CHAR")
    
    echo "The string is: $STRING"
    echo "We're looking for the character: $CHAR"
    echo "It is at position: $POSITION"

    Рассмотрим этот код подробно:

    • Мы начинаем с команды echo с опцией -e и управляющей последовательностью \n.

      echo -e "\nStep 3: Finding Character Position"
      • Опция -e включает интерпретацию управляющих последовательностей.
      • \n добавляет пустую строку перед текстом, создавая визуальное разделение разделов.
    • Затем мы определяем две переменные:

      STRING="abcdefghijklmnopqrstuvwxyz"
      CHAR="j"
      • STRING содержит весь строчный алфавит.
      • CHAR содержит символ "j", который мы будем искать.
    • Мы используем команду expr index для поиска позиции символа:

      POSITION=$(expr index "$STRING" "$CHAR")
      • expr — это утилита для вычисления выражений.
      • Операция index ищет символы в строке.
      • Синтаксис $() перехватывает вывод команды и присваивает его переменной POSITION.
      • Мы заключаем переменные в двойные кавычки ("$STRING"), чтобы избежать проблем со специальными символами.
      • Важно: Эта команда возвращает позицию, начиная с 1 (а не с 0).
    • Наконец, выводим результаты:

      echo "The string is: $STRING"
      echo "We're looking for the character: $CHAR"
      echo "It is at position: $POSITION"
  2. Сохраните файл и снова запустите скрипт:

    ./string_operations.sh

Вы увидите дополнительный вывод:

Step 3: Finding Character Position
The string is: abcdefghijklmnopqrstuvwxyz
We're looking for the character: j
It is at position: 10

Обратите внимание, что позиция отсчитывается от 1, то есть первый символ находится в позиции 1, а не 0. Это отличается от многих языков программирования, где индексация обычно начинается с нуля.

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

Теперь научимся извлекать часть строки.

  1. Добавьте следующий код в файл string_operations.sh:

    echo -e "\nStep 4: Substring Extraction"
    
    STRING="The quick brown fox jumps over the lazy dog"
    START=10
    LENGTH=5
    
    SUBSTRING=${STRING:$START:$LENGTH}
    
    echo "The original string is: $STRING"
    echo "Extracting 5 characters starting from position 10:"
    echo "The substring is: $SUBSTRING"

    Проанализируем этот фрагмент:

    • Сначала добавляем заголовок с новой строкой:

      echo -e "\nStep 4: Substring Extraction"
    • Определяем переменные:

      STRING="The quick brown fox jumps over the lazy dog"
      START=10
      LENGTH=5
      • STRING содержит пример предложения.
      • START — это позиция, с которой мы хотим начать извлечение (позиция 10).
      • LENGTH — количество символов, которые нужно извлечь (5 символов).
    • Используем синтаксис извлечения подстроки Bash:

      SUBSTRING=${STRING:$START:$LENGTH}
      • Синтаксис выглядит так: ${variable:start_position:length}
      • $START и $LENGTH — это переменные со значениями 10 и 5.
      • Важно: В отличие от команды expr index, здесь позиции отсчитываются от 0, то есть первый символ находится в позиции 0.
    • Выводим результаты:

      echo "The original string is: $STRING"
      echo "Extracting 5 characters starting from position 10:"
      echo "The substring is: $SUBSTRING"
  2. Сохраните файл и запустите скрипт:

    ./string_operations.sh

Вы увидите следующий вывод:

Step 4: Substring Extraction
The original string is: The quick brown fox jumps over the lazy dog
Extracting 5 characters starting from position 10:
The substring is: brown

В строке "The quick brown fox..." позиция 10 (при отсчете от 0) — это буква 'b' в слове "brown", а следующие 5 символов составляют слово "brown". Именно поэтому наша извлеченная подстрока — "brown".

Помните о разнице в индексации:

  • В expr index (Шаг 3) позиции начинаются с 1.
  • В извлечении подстроки ${STRING:position:length} (Шаг 4) позиции начинаются с 0.

Это частая причина путаницы в shell-скриптах, поэтому важно помнить, какая операция какую систему индексации использует.

Замена строк

Наконец, научимся заменять части строки.

  1. Добавьте следующий код в файл string_operations.sh:

    echo -e "\nStep 5: String Replacement"
    
    STRING="The quick brown fox jumps over the lazy dog"
    echo "Original string: $STRING"
    
    ## Замена первого вхождения 'o' на 'O'
    NEW_STRING=${STRING/o/O}
    echo "Replacing first 'o' with 'O': $NEW_STRING"
    
    ## Замена всех вхождений 'o' на 'O'
    NEW_STRING=${STRING//o/O}
    echo "Replacing all 'o' with 'O': $NEW_STRING"
    
    ## Замена 'The quick' на 'The slow', если это в начале строки
    NEW_STRING=${STRING/#The quick/The slow}
    echo "Replacing 'The quick' with 'The slow' at the beginning: $NEW_STRING"
    
    ## Замена 'dog' на 'cat', если это в конце строки
    NEW_STRING=${STRING/%dog/cat}
    echo "Replacing 'dog' with 'cat' at the end: $NEW_STRING"

    Разберем каждую операцию замены:

    • Выводим заголовок и исходную строку:

      echo -e "\nStep 5: String Replacement"
      STRING="The quick brown fox jumps over the lazy dog"
      echo "Original string: $STRING"
    • Замена первого вхождения символа:

      ## Замена первого вхождения 'o' на 'O'
      NEW_STRING=${STRING/o/O}
      echo "Replacing first 'o' with 'O': $NEW_STRING"
      • Синтаксис: ${variable/pattern/replacement}
      • Это найдет первое вхождение 'o' и заменит его на 'O'.
      • Будет заменена только первая буква 'o' в слове "brown", остальные останутся прежними.
    • Замена всех вхождений символа:

      ## Замена всех вхождений 'o' на 'O'
      NEW_STRING=${STRING//o/O}
      echo "Replacing all 'o' with 'O': $NEW_STRING"
      • Синтаксис: ${variable//pattern/replacement} (обратите внимание на двойной слэш)
      • Двойной слэш указывает Bash заменить ВСЕ совпадения с шаблоном.
      • Все буквы 'o' во всей строке будут заменены на 'O'.
    • Замена шаблона в начале строки:

      ## Замена 'The quick' на 'The slow', если это в начале строки
      NEW_STRING=${STRING/#The quick/The slow}
      echo "Replacing 'The quick' with 'The slow' at the beginning: $NEW_STRING"
      • Синтаксис: ${variable/#pattern/replacement}
      • Символ # указывает, что шаблон должен находиться строго в начале строки.
    • Замена шаблона в конце строки:

      ## Замена 'dog' на 'cat', если это в конце строки
      NEW_STRING=${STRING/%dog/cat}
      echo "Replacing 'dog' with 'cat' at the end: $NEW_STRING"
      • Синтаксис: ${variable/%pattern/replacement}
      • Символ % указывает, что шаблон должен находиться строго в конце строки.
  2. Сохраните файл и запустите скрипт:

    ./string_operations.sh

Вы увидите вывод:

Step 5: String Replacement
Original string: The quick brown fox jumps over the lazy dog
Replacing first 'o' with 'O': The quick brOwn fox jumps over the lazy dog
Replacing all 'o' with 'O': The quick brOwn fOx jumps Over the lazy dOg
Replacing 'The quick' with 'The slow' at the beginning: The slow brown fox jumps over the lazy dog
Replacing 'dog' with 'cat' at the end: The quick brown fox jumps over the lazy cat

Эти операции замены являются мощными инструментами для манипулирования текстом. Они позволяют выполнять точечные изменения на основе шаблонов и позиций, что особенно полезно для таких задач, как обработка данных, форматирование текста или изменение содержимого файлов.

Резюме

В ходе этой лабораторной работы вы изучили и применили на практике несколько фундаментальных операций со строками в shell-скриптах:

  1. Создание и запуск shell-скрипта.
  2. Вычисление длины строки с помощью ${#string}.
  3. Поиск позиции символа в строке с помощью $(expr index "$string" "$char").
  4. Извлечение подстроки из более длинной строки с помощью ${string:start:length}.
  5. Выполнение различных операций замены:
    • ${string/pattern/replacement} — замена первого вхождения.
    • ${string//pattern/replacement} — замена всех вхождений.
    • ${string/#pattern/replacement} — замена в начале строки.
    • ${string/%pattern/replacement} — замена в конце строки.

Эти навыки составляют основу для более сложных задач по обработке текста. По мере работы с shell-скриптами вы обнаружите, что эти операции неоценимы для анализа и преобразования текстовых данных в ваших проектах. Помните, что практика — залог мастерства, поэтому не бойтесь экспериментировать с различными строками и операциями!