Bashで1つの文字を別の文字に置き換える


223

bashの文字列でスペース()をドット(.)に置き換えることができるようにする必要があります。

これはかなり単純だと思いますが、私は新しいので、この使用のために同様の例を変更する方法を理解できません。

回答:


390

インラインシェル文字列置換を使用します。例:

foo="  "

# replace first blank only
bar=${foo/ /.}

# replace all blanks
bar=${foo// /.}

詳細については、http://tldp.org/LDP/abs/html/string-manipulation.htmlを参照してください。


1
この解決策は、短い文字列を処理する場合によくありますが(一般的なケースでは、私はそうです)tr、長い文字列を好むかもしれません。私のシステムでtrは、複数の文字を含む文字列で始まるbashよりもパフォーマンスが優れています1000。bashの時間の複雑さは線形よりも悪いようです。小さなテスト:x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"。1Mの文字列の長さで(= 2 ^ 20)trかかった0.04sとのbash 5.0.11がかかりました17s。2Mでtr取った0.07s(予想される)が、bashがかかった69s(2回文字列の長さのために長いとして4回)。
ソコウィ

変数に格納された1MBで@Socowiをプレイすることは、通常ではありません。10Kbを超えると、bashはforkするよりも速いままtrです!...使用可能なメモリとハードウェアリソースによっては...しかし、あなたの言う通りです!:実行する作業の種類によっては、専用ツールの方が効率的です。
F.ハウリ

改行などのエスケープ文字については、必ず検索してください$'\n'
user2561747

75

次のtrようにを使用できます。

tr " " .

例:

# echo "hello world" | tr " " .
hello.world

からman tr

説明
     標準入力から文字を変換、圧縮、削除し、標準出力に書き込みます。


これは質問どおりに機能しますが、受け入れられた回答(文字の置換と任意の文字列にも機能します)よりも一般的ではなく、外部コマンドも含まれます。
Dan Dascalescu 2017年

2
一方、それは全体をメモリにロードせずに2GBファイルで動作します。
aioobe 2017年

問題は「bashの文字列」であり、任意の大きなファイルではありませんでした。
Dan Dascalescu 2017年

52

bashでは、文字列内で構文を使用してパターン置換を行うことができます${VARIABLE//PATTERN/REPLACEMENT}。ちょうど使用/していない//だけで最初の発生を交換します。パターンは、ファイルグロブのようなワイルドカードパターンです。

string='foo bar qux'
one="${string/ /.}"     # sets one to 'foo.bar qux'
all="${string// /.}"    # sets all to 'foo.bar.qux'



4

パスのためにこれを試してください:

echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'

二重引用符で囲まれた文字列内のスペースを+歌に置き換え、次に+記号をバックスラッシュに置き換え、二重引用符を削除/置換します。

Cygwinのパスの1つにあるスペースを置き換えるためにこれを使用する必要がありました。

echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'

2
で問題を解決する2年前の答えがすでにありsedます。引用は無関係です。
chepner 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.