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が置き換えるデフォルトの区切り文字など、コマンドkey
にsed
特別な意味を持つ文字が変数に含まれていないことを確認する必要があります。/
この場合、このような他の文字を使用できます"s@pattern@replacement@g" file
。
次に、開いている括弧と対応する閉じ括弧を一致させる必要があります。つまり、\[.*\]
sedは貪欲です。行にが含まれている場合、[text1] text2 [text3]
sedはすべて一致します。したがって、.*
右角かっこではない文字を0回以上定義する必要があります[^]]*
。
上記では、キャレット()の後に少なくとも1つの文字が除外されるのを待つ\]
ので、中括弧()をエスケープする必要がないため、リストの閉じ括弧で除外された文字として誤って読み取られません。しかし、リテラル角括弧として使用されます。sed
^
これで変更を適用するには、-i
以下に説明する方法を使用できます。郵便はがき。ただし、最初にテストせずに-i
出力の一部を確認し、うまく見えることを確認してください。
したがって、これはsed
あなたのケースで動作すると予想されます。
sed -i "s/\[[^]]*\]/$key/g" file
答え2
正規表現に「*」の前に「.」はありません。開くかっこと閉じ括弧が1つしかないと確信している場合は、次のように動作します。
sed "s/\[.*\]/$key/g" /tmp/file
これは標準出力として印刷します。所定の位置で編集するには、を使用しますsed -i
。