sed正規表現の問題

sed正規表現の問題

ファイルの文字列を置き換えようとしています。

$RELEASE     = '1234';

RELEASEと=記号の間のスペースは、スペースまたはタブ文字にすることができます。バージョン番号の周りの引用符は、一重引用符または二重引用符のいずれかです。

私は現在、スペースと一重引用符が機能していると仮定しています。

sed 's/$RELEASE[[:space:]]*\=[[:space:]]*'\''[0-9]*'\'';/$RELEASE = '\''1234'\'';/g' config.ini > config.ini

だから多くの作業の後にこれが動作します。ただし、文字列が空白(タブとは反対)で、一重引用符が二重引用符と反対の場合にのみ適用されます。タブを修正するためにこれまで試したことは次のとおりです。

sed 's/$RELEASE([[:space:]]|\t)*\=([[:space:]]|\t)*'\''[0-9]*'\'';/$RELEASE = '\''1234'\'';/g' config.ini > config.ini

私はほとんどのsed正規表現が/ tをサポートしていないという内容を読んだ。これは本当ですか? [[:tab:]] 型置換はありますか? (私は努力した)

どんな助けでも大変感謝します。

ベストアンサー1

私は何の問題もありません[[:space:]]。以下は、空白とタブの混合交換を示す非常に愚かな小さな例です。

$ echo -e 'A \t \t B' | sed 's/A[[:space:]]*B/WORKED/'
WORKED

短いため、\s通常、大きな文字列に適した方法を使用することもできます。sed

$ echo -e 'A \t \t B' | sed 's/A\s*B/WORKED/'
WORKED

とにかく、実際の問題はその面倒な一重引用符を避けることだと思います。私が見つけた最も簡単な方法は、一重引用符で囲まれた文字列を分割し、一重引用符に二重引用符を使用してから(必要に応じて)一重引用符で囲まれた行を返すことです。 Bashはすべてを自動的に接続します。

$ echo 'This is a nice string and this is a single quote:'"'"' Nice?'
This is a nice string and this is a single quote:' Nice?

したがって、私たちが節約したすべてのスペースは、\sこの巨大な引用状況によって破壊されるでしょう。

$ echo -e '$RELEASE  \t = '"'"'1234'"'"';' |\
  sed 's/$RELEASE\s*=\s*'"'"'[0-9]*'"'"'\;/REPLACEMENT/'

$RELEASE[\s=]+もちろん、(これはPHPスクリプトのように見えるため)、行が始まると行全体を置き換えることができると仮定できるという主張があります。明らかに、これは必ずしもそうではありませんが(アプリケーション全体がひどく見えない場合があります)、検索と交換がより楽しくなります。

sed 's/$RELEASE[\s=]*.*/REPLACEMENT/'

はい、一般的なsed使用規則が適用されます。ストリームエディタ(例sed:)にエコーを表示せずにファイルにリダイレクトします。もし動作し、ファイルを簡単に破損する可能性があります。

パラメータを使用するか-i(適用sed)、Spongeなどのアプリケーションに入力をパイプします(遅延出力に似ています)。

sed -i '...' file
sed '...' file | sponge file

おすすめ記事