sed + 角かっこ内の文字列をキーに置き換える

sed + 角かっこ内の文字列をキーに置き換える

sedを使用して[… .]の内容を対象に変えたいです。key=new_string

more /tmp/file
my.uri=http://[linux123]:8080

これを試してみましょう

key=new_string

sed  s"/\[*\]/$key/g" /tmp/file

しかし、ファイルは変更されませんでした。

more file
my.uri=http://[linux123]:8080

私のsedに問題がありますか?

予想される結果は次のとおりです(角括弧を除く)。

more file
my.uri=http://new_string:8080

ベストアンサー1

まず、sedが置き換えるデフォルトの区切り文字など、コマンドkeysed特別な意味を持つ文字が変数に含まれていないことを確認する必要があります。/この場合、このような他の文字を使用できます"s@pattern@replacement@g" file

次に、開いている括弧と対応する閉じ括弧を一致させる必要があります。つまり、\[.*\]sedは貪欲です。行にが含まれている場合、[text1] text2 [text3]sedはすべて一致します。したがって、.*右角かっこではない文字を0回以上定義する必要があります[^]]*

上記では、キャレット()の後に少なくとも1つの文字が除外されるのを待つ\]ので、中括弧()をエスケープする必要がないため、リストの閉じ括弧で除外された文字として誤って読み取られません。しかし、リテラル角括弧として使用されます。sed^

これで変更を適用するには、-i以下に説明する方法を使用できます。郵便はがき。ただし、最初にテストせずに-i出力の一部を確認し、うまく見えることを確認してください。

したがって、これはsedあなたのケースで動作すると予想されます。

sed -i "s/\[[^]]*\]/$key/g" file

おすすめ記事