web-dev-qa-db-ja.com

シェルスクリプトで1つのサブストリングを別のストリングに置き換える

私は "Suzi and Marryが大好きです"を持っていますが、 "Suzi"を "Sara"に変更したいです。

#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
# do something...

結果は次のようになります。

firstString="I love Sara and Marry"
592
Zincode

firstの出現箇所を指定の文字列に置き換えるには、${parameter/pattern/string}を使用します。

#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
echo "${firstString/Suzi/$secondString}"    
# prints 'I love Sara and Marry'

allオカレンスを置き換えるには、${parameter//pattern/string}を使用します。

message='The secret code is 12345'
echo "${message//[0-9]/X}"           
# prints 'The secret code is XXXXX'

(これは Bashリファレンスマニュアル、§3.5.3 "シェルパラメータの拡張" に記載されています。)

この機能はPOSIXでは指定されていないことに注意してください - それはBash拡張です - それですべてのUnixシェルがそれを実装しているわけではありません。関連するPOSIX文書については、 オープングループ技術標準ベース仕様書、第7号シェル&ユーティリティ巻、§2.6.2 "パラメータ拡張" を参照してください。

963
ruakh

これは完全に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"
157
Kevin

これを試して:

 sed "s/Suzi/$secondString/g" <<<"$firstString"
55
Kent

文字列にRegExp文字が含まれている場合は、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/\~}"

編集: ~の引用/エスケープに関するメモのコメントでMark Haferkampに感謝します。*

変数$HOMEにスラッシュが含まれていることに注意してくださいが、これは何も壊しませんでした。

さらに読むこと: 高度なBashスクリプトガイド
sedを使用することが必須である場合は、必ず すべての文字をエスケープする

43
Camilo Martin

Dashについては、以前の投稿はすべて機能していません

POSIXのsh互換性のある解決策は:

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

明日あなたがあなたが結婚を愛していないと決めたなら、彼女も同様に取り替えることができます:

today=$(</tmp/lovers.txt)
tomorrow="${today//Suzi/Sara}"
echo "${tomorrow//Marry/Jesica}" > /tmp/lovers.txt

恋人を去るには50通りの方法があるはずです。

14
Josh Habdas

私はコメントを加えることができないので。 @ruaka例を読みやすくするには、次のように書きます。

full_string="I love Suzy and Mary"
search_string="Suzy"
replace_string="Sara"
my_string=${full_string/$search_string/$replace_string}
or
my_string=${full_string/Suzy/Sarah}
2
Nate Revo