「I love Suzi and Marry」があり、「Suzi」を「Sara」に変更したい。
#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
# do something...
結果は次のようになります。
firstString="I love Sara and Marry"
パターンの最初の出現を特定の文字列に置き換えるには、次を使用します。${parameter/pattern/string}
#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
echo "${firstString/Suzi/"$secondString"}"
# prints 'I love Sara and Marry'
すべてのオカレンスを置き換えるには、次を使用します。${parameter//pattern/string}
message='The secret code is 12345'
echo "${message//[0-9]/X}"
# prints 'The secret code is XXXXX'
(これは Bash Reference Manual の §3.5.3 "Shell Parameter Expansion" に記載されています。 )
この機能は POSIX では指定されていないことに注意してください — これは Bash の拡張機能です — したがって、すべての Unix シェルがそれを実装しているわけではありません。関連する POSIX ドキュメントについては、The Open Group Technical Standard Base Specifications、Issue 7、Shell & Utilitiesボリューム、§2.6.2 "Parameter Expansion"を参照してください。
これは完全に bash 文字列操作で行うことができます:
first="I love Suzy and Mary"
second="Sara"
first=${first/Suzy/$second}
これは、最初に出現したものだけを置き換えます。それらをすべて置き換えるには、最初のスラッシュを 2 倍にします。
first="Suzy, Suzy, Suzy"
second="Sara"
first=${first//Suzy/$second}
# first is now "Sara, Sara, Sara"
ダッシュの場合、以前の投稿はすべて機能していません
POSIXsh
互換のソリューションは次のとおりです。
result=$(echo "$firstString" | sed "s/Suzi/$secondString/")
これにより、入力の各行で最初に出現したものが置き換えられます。/g
すべてのオカレンスを置き換えるフラグを追加します。
result=$(echo "$firstString" | sed "s/Suzi/$secondString/g")
これを試して:
sed "s/Suzi/$secondString/g" <<<"$firstString"
sed
文字列に正規表現文字が含まれる場合よりも、Bash を使用する方が適切です。
echo ${first_string/Suzi/$second_string}
これは Windows に移植可能で、少なくとも Bash 3.1 までは動作します。
エスケープについてあまり心配する必要がないことを示すために、これを変えてみましょう。
/home/name/foo/bar
これに:
~/foo/bar
ただし/home/name
、最初にある場合に限ります。必要ありませんsed
!
Bash が魔法の変数$PWD
とを与えるとすれば$HOME
、次のことができます。
echo "${PWD/#$HOME/\~}"
引用/エスケープに関するコメントのマーク・ハファーカンプに感謝し~
ます.*
変数$HOME
にスラッシュが含まれていることに注意してください。ただし、これは何も壊しませんでした。
詳細情報: Advanced Bash-Scripting Guide .
使用sed
が必須の場合は、必ずすべての文字をエスケープしてください。