14

Замена одной подстроки на другую в shell-скрипте

11

У меня есть строка firstString = "I love Suzi and Marry", и я хочу заменить в ней "Suzi" на "Sara".

Вот код, который у меня есть:

firstString = "I love Suzi and Marry"
secondString = "Sara"

Я хочу получить следующий результат:

firstString = "I love Sara and Marry"

Как мне правильно выполнить эту замену?

5 ответ(ов)

2

Для Dash все предыдущие решения не работают.

Совместимое с POSIX решение на sh выглядит следующим образом:

result=$(echo "$firstString" | sed "s/Suzi/$secondString/")

Этот код заменит первое вхождение на каждой строке ввода. Чтобы заменить все вхождения, добавьте флаг /g:

result=$(echo "$firstString" | sed "s/Suzi/$secondString/g")
0

Команда echo [string] | sed "s|[original]|[target]|g" выполняет замену в строке, где:

  • s означает "заменить"
  • g означает "глобально, все совпадения"

Таким образом, данная команда принимает [string] как входящие данные, ищет все вхождения подстроки [original]и заменяет их на[target]`.

0

Поскольку я не могу оставить комментарий, отвечаю здесь. @ruaka Чтобы сделать пример более читабельным, запишите его так:

full_string="I love Suzy and Mary"
search_string="Suzy"
replace_string="Sara"
my_string=${full_string/$search_string/$replace_string}
или
my_string=${full_string/Suzy/Sarah}

Таким образом, вы сможете заменить search_string на replace_string в строке full_string.

0

Чтобы заменить первое вхождение шаблона с использованием специальных символов в Bash, вы можете использовать следующий синтаксис:

Для замены первого вхождения:

${parameter/pattern/string}

Для замены всех вхождений:

${parameter//pattern/string}

В вашем примере кода, если вы хотите заменить первое вхождение //Suzi// на значение переменной secondString, вам нужно выполнить следующую операцию:

firstString="I love //Suzi// and Marry"
secondString="Sara"
firstString="${firstString/\/\/Suzi\/\//"$secondString"}"
echo $firstString

После выполнения этого кода вывод будет: I love Sara and Marry.

Обратите внимание, что // в вашем шаблоне экранированы с помощью \ для корректной замены.

0

Я думаю, что это самый чистый способ для вашего случая:

firstString="${firstString//Suzi/$secondString}"

Этот код заменяет все вхождения строки "Suzi" в переменной firstString на значение переменной secondString.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь