#linux #string #bash #shell
#linux #строка #bash #оболочка
Вопрос:
Когда я использую механизм подстановки строки оболочки, заменяется только первое вхождение.
Например, если я попытаюсь заменить подстроку @folder
подстрокой mypod
в строке:
hostname | grep @folder amp;amp; cat /etc/hosts | grep @folder
Я получаю
hostname | grep mypod amp;amp; cat /etc/hosts | grep @folder
Вот что я попробовал:
root@mypod:/# export var="hostname | grep @folder amp;amp; cat /etc/hosts | grep @folder"
root@mypod:/# echo $var
hostname | grep @folder amp;amp; cat /etc/hosts | grep @folder
root@mypod:/# var2=${var/@folder/mypod}
root@mypod:/# echo $var2
hostname | grep mypod amp;amp; cat /etc/hosts | grep @folder
Чего мне не хватает?
Заранее спасибо
Ответ №1:
${var/@folder/mypod}
должно быть ${var//@folder/mypod}
Если вы используете bash, здесь у вас есть руководство по расширению переменных, которое может оказаться полезным.
Комментарии:
1. Спасибо, но я не понимаю, почему я должен избегать @. Это уже работает таким образом
2.
//@
это не экранирование, это синтаксис замены для замены ВСЕХ экземпляров, и это/@
заменит только ПЕРВЫЙ3. Спасибо, снова Мигель. Это именно то, что я искал.
Ответ №2:
Из справочной страницы bash, раздел Расширение параметра: заменяется самое длинное совпадение шаблона с его значением. В нем не говорится «все совпадения заменены»
Комментарии:
1. ОК. Конкретно, могу ли я заставить его заменить все экземпляры или это невозможно?
2. @Abdelghani: Из того, что я знаю, с расширением параметра, только путем перебора параметра и применения замены снова и снова, пока она больше не изменится. Это то, что вы могли бы поместить в функцию. Тем не менее, Мигель предоставил в своем ответе решение, которое, возможно, работает (для меня это тоже ново). Другой возможностью является использование внешнего инструмента, такого как
sed
, но это означает, что вы создаете дочерний процесс. В зависимости от вашего конкретного приложения это может считаться приемлемым или слишком дорогим.