web-dev-qa-db-ja.com

シェル文字列で二重置換を行うことは可能ですか?

単一置換は簡単です:

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
Akiva

私の知る限り、bashの現在のバージョンでそれを行う唯一の方法は、2つのステップです。

$ 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

もちろん、trsedPerlなどの外部ツールで簡単に実行できます

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

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

$ tr at og <<< "$string"
Mork Shuggleworgh
10
steeldriver

1文字に置き換えているので、 tr を使用するだけです。

tr at og

これにより、各aoに置き換えられ、各tgに置き換えられます。あなたの例では:

ek@Io:~$ tr at og <<<'Mark Shuttleworth'
Mork Shuggleworgh
6
Eliah Kagan