2

プロパティ ファイル内のテキスト行を置き換えようとしています。例えば:

food.type=banana

このコード行を使用すると、バナナを別の入力で完全に置き換えることができます。

FOOD=apple
sed "s/food.type=.*/food.type=$FOOD/" 

出力:

food.type=apple

ただし、置換しようとしている前のテキスト行に が/含まれている場合、置換を機能させることができません。例えば:

food.type=/yellow/banana

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

5

スラッシュは、正規表現の一致/置換パターンを閉じるものとして読み取られています。

行う

sed "s@food.type=.*@food.type=$FOOD@" 

一部のsedでは、非標準の区切り文字の最初のインスタンスをエスケープする必要があります。

sed "s\@food.type=.*@food.type=$FOOD@" 

これがお役に立てば幸いです。

于 2012-05-21T17:03:56.620 に答える
1

別のオプションは、sed の区切り文字として使用し続け/、置換文字列内のスラッシュをエスケープすることです。bash はこれを行うことができます (ただし、不可解ですが):

sed "s/food.type=.*/food.type=${FOOD//\//\/}/"

その変数置換はやや不可解なので、分解して少しずつ説明しましょう。

${FOOD FOOD の変数置換を開始し、
// すべて
\/ の文字/(このコンテキストではエスケープする必要があることに注意してください)
/ を次 の
\/ 置換文字列に置き換えます\/(ここでのエスケープは単に置換文字列の一部として扱われることに注意してください) 。
}

しかし、これは完全に完璧というわけではありません。置換文字列に含まれると問題を引き起こす可能性のある文字が他にもいくつかあるからです。これを完全に防ぐには、bash でいくつかの置換を行う (乱雑) か、次のようにジョブをファームアウトしsedます。

ESCAPEDFOOD="$(printf "%s" "$FOOD" | sed 's/[\/&]/\\&/g')"
sed "s/food.type=.*/food.type=$ESCFOOD/"

繰り返しますが、置換は少しわかりにくいので、内訳は次のとおりです。

s/、、または
[\/&] 文字のいずれかの パターンを置換 します... 置換文字列(ここでエスケープ) に続いて元の一致 ... グローバルに (つまり、すべての出現を置換します)\/&
/
\\&\
/g

sed(そうです、 で使用する文字列を準備するために を使用する皮肉なことは承知していsedます。)

厄介な文字をいくつか見逃している可能性があることに注意してください。その場合は、それらを式に追加できます[]

于 2012-05-21T21:50:57.557 に答える