1

私はシェル (bash) スクリプトを作成しており、簡単なタスクを実行する簡単な方法を見つけようとしています。

変数に文字列があります。これが関連しているかどうかはわかりませんが、実際にはこの文字列はテキスト ファイル全体の内容であるため、スペースや改行を含めることができます。

特定の部分文字列の最後の出現を別のものに置き換えたい。おそらく、そのために正規表現を使用できますが、混乱する瞬間が 2 つあります。

  • 最初からではなく、最後から一致する必要があります
  • スキャンしたい部分文字列は可変ではなく固定です。
4

5 に答える 5

4
  • 最初に切り捨てるため:${var#pattern}
  • 最後に切り捨て${var%pattern}
  • ${var/pattern/repl}一般交換用

パターンは「ファイル名」スタイルの展開であり、最後のパターンは先頭または末尾にプレフィックスを付ける#%、一致させることができます (それぞれ)

それはすべて(長い)bashマンページにあります。「パラメータ拡張」の章を確認してください。

于 2009-02-06T21:36:44.280 に答える
1

amn 式はこのように

s/match string here$/new string/

トリックを行う必要があります-sは置換用で、/コマンドを分割し、$は行末マーカーです。これを vi で試して、必要なことが行われるかどうかを確認できます。

于 2009-02-06T21:36:06.747 に答える
0

ハビエルの答えはシェル固有であり、すべてのシェルで機能するわけではありません。

MrTellyとepochwolfがほのめかしたsedの回答は不完全であり、次のようになります。

MyString="stuff ttto be edittted"
NewString=`echo $MyString | sed -e 's/\(.*\)ttt\(.*\)/\1xxx\2/'`

$を使用して終了をマークせずにこれが機能する理由は、最初の'。*'が貪欲であり、正規表現の残りの部分が真になるようにしながら、可能な限り収集しようとするためです。

このsedコマンドは、使用されるすべてのシェルコンテキストで正常に機能するはずです。

于 2009-02-10T09:06:00.113 に答える
0

通常、Sed で行き詰まったときは、このページを使用します。

http://sed.sourceforge.net/sed1line.txt

于 2009-04-28T10:51:32.413 に答える
0

awk または sed の man ページを調べます。

于 2009-02-06T21:32:30.747 に答える