質問
私はシェル (bash) スクリプトを書いており、単純なタスクを達成する簡単な方法を見つけようとしています。
変数に文字列があります。これが関連しているかどうかはわかりませんが、実際にはこの文字列はテキスト ファイル全体の内容であるため、スペースや改行を含めることができます。
特定の部分文字列の最後に出現した部分を別のものに置き換えたいと考えています。おそらく正規表現を使用できるのですが、混乱する点が 2 つあります。
- 最初からではなく最後から一致させる必要がある
- スキャンしたい部分文字列は可変ではなく固定です。
解決
- 先頭で切り捨てる場合:
${var#pattern}
- 最後を切り捨てる
${var%pattern}
${var/pattern/repl}
一般的な交換用
パターンは「filename」形式の展開であり、最後のパターンには接頭辞を付けることができます。 #
または %
(それぞれ) 先頭または末尾のみで一致する
すべては (長い) bash マンページにあります。「パラメータ拡張」の章を確認してください。
他のヒント
このようなAMN式
s/match string here$/new string/
トリックを行う必要があります - sがsustitute用で、/コマンドを分解し、$は、ラインマーカーの終わりです。あなたはそれが何が必要ないかどうかを確認するためのVIでこれを試すことができます。
私はAWKのmanページを調べるか、sedのでしょう。
ハビエルの答えはシェル特有のものであり、すべてのシェルでは動作しません。
MrTellyとepochwolfを示唆したsedの答えが不完全であり、このようなものになります。
MyString="stuff ttto be edittted"
NewString=`echo $MyString | sed -e 's/\(.*\)ttt\(.*\)/\1xxx\2/'`
これは終わりをマークするために$を使用せずに動作理由は最初ということである「*」貪欲で、正規表現の残りの部分は真実であることを可能にしながら、できるだけ多くを集めしようとします。
このsedコマンドは、使用されるすべてのシェルコンテキストで正常に動作する必要があります。
通常、私はsedので立ち往生したときに、私は、このページを使用して、