Подстановка строки оболочки Linux с несколькими вхождениями

#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 , но это означает, что вы создаете дочерний процесс. В зависимости от вашего конкретного приложения это может считаться приемлемым или слишком дорогим.