web-dev-qa-db-ja.com

文字列内の一部の文字を別の文字に置き換える

AxxBCyyyDEFzzLMNのような文字列があり、xy、およびのすべての出現箇所を置き換えます。 (===)z_

どうすればこれを達成できますか?

私はecho "$string" | tr 'x' '_' | tr 'y' '_'がうまくいくことを知っていますが、私はパイプを使わずに一度にそれをしたいのです。

240
Amarsh
echo "$string" | tr xyz _

xy、またはzの各出現箇所を_に置き換え、例ではA__BC___DEF__LMNを指定します。

echo "$string" | sed -r 's/[xyz]+/_/g'

xy、またはzの繰り返し出現を単一の_に置き換え、あなたの例ではA_BC_DEF_LMNを与えるでしょう。

276
jkasnicki

Bashパラメータ展開 を使う:

orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}
250

このリンクは役に立ちます。

http://tldp.org/LDP/abs/html/string-manipulation.html

一般に、

$ substringの最初の一致を$ replacementに置き換えます。

${string/substring/replacement}

$ substringのすべての一致を$ replacementに置き換えます。

${string//substring/replacement}

編集:これは$ stringという名前の変数に適用されることに注意してください。

90
Dylan Daniels
read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter

^あなたが必要とする限りこれらの多くを使用しなさい、そしてあなたはあなた自身のBASIC暗号化を作ることができる

5
Michael

これは、複数の連続するオカレンスを単一の_に置き換えるShellパラメータ展開を使用したソリューションです。

$ var=AxxBCyyyDEFzzLMN
$ echo "${var//+([xyz])/_}"
A_BC_DEF_LMN

+(pattern)パターンは拡張パターンマッチングを必要とします。

shopt -s extglob

あるいは、tr-s( "squeeze")オプションを使用します。

$ tr -s xyz _ <<< "$var"
A_BC_DEF_LMN
5
Benjamin W.