Действительно ли возможно сделать двойную замену со строкой оболочки?

Единственная Замена легка:

string="Mark Shuttleworth"
echo ${string/a/o}

Mork Shuttleworth

действительно ли это возможно, хотя сделать двойное одновременно?

echo ${string/a/o string/t/g} #doesn't work, but you get the idea

Mork Shuggleworgh

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

Спасибо

6
задан 21 January 2017 в 15:24

3 ответа

Насколько я знаю, единственный способ сделать это в текущих версиях bash находится на двух шагах, например,

$ string="Mark Shuttleworth"
$ string="${string//a/o}"; echo "${string//t/g}"
Mork Shuggleworgh

Попытки вложить результат замен по ошибке:

$ echo "${${string//a/o}//t/g}"
bash: ${${string//a/o}//t/g}: bad substitution

Примечание, что другие оболочки могут поддерживать такие вложенные замены, например, в zsh 5.2:

~ % string="Mark Shuttleworth"
~ % echo "${${string//a/o}//t/g}"
Mork Shuggleworgh

, Конечно, внешние инструменты такой как tr, sed, perl могут сделать это легко

$ sed 'y/at/og/' <<< "$string"
Mork Shuggleworgh

$ perl -pe 'tr /at/og/' <<< "$string"
Mork Shuggleworgh

$ tr at og <<< "$string"
Mork Shuggleworgh
10
ответ дан 23 November 2019 в 07:20

Вы заменяете одними буквами, поэтому просто используете tr :

tr at og

Это заставляет каждого a быть замененным o и каждый t, чтобы быть замененным g. С Вашим примером:

ek@Io:~$ tr at og <<<'Mark Shuttleworth'
Mork Shuggleworgh
6
ответ дан 23 November 2019 в 07:20

Попробуйте

echo ${string/a/o} ${string/t/g}

, я использую свой планшет, никакой bash для тестирования.

можно хотеть к контролю с помощью printf намного более гибкая команда.

-1
ответ дан 23 November 2019 в 07:20

Другие вопросы по тегам:

Похожие вопросы: