1129

「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"
4

10 に答える 10

1905

パターンの最初の出現を特定の文字列に置き換えるには、次を使用します。${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 7Shell & Utilitiesボリューム、§2.6.2 "Parameter Expansion"を参照してください。

于 2012-11-03T16:05:06.823 に答える
281

これは完全に 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"
于 2012-11-03T16:05:35.710 に答える
171

ダッシュの場合、以前の投稿はすべて機能していません

POSIXsh互換のソリューションは次のとおりです。

result=$(echo "$firstString" | sed "s/Suzi/$secondString/")

これにより、入力の各行で最初に出現したものが置き換えられます。/gすべてのオカレンスを置き換えるフラグを追加します。

result=$(echo "$firstString" | sed "s/Suzi/$secondString/g")
于 2014-04-09T08:56:20.060 に答える
76

これを試して:

 sed "s/Suzi/$secondString/g" <<<"$firstString"
于 2012-11-03T16:04:21.233 に答える
55

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が必須の場合は、必ずすべての文字をエスケープしてください。

于 2014-06-22T03:43:53.667 に答える