sedがこの複数行パターン文字列を正しく解釈できないのはなぜですか?

sedがこの複数行パターン文字列を正しく解釈できないのはなぜですか?

ログファイルからINFOメッセージを削除するために使用される非常に大きな正規表現パターン文字列があります。以下のように、これらすべてを一行で使用するとうまくいきます。

sed -r '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]) [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3} INFO)/d' >> $2

さて、見てわかるように、読みにくいので変数に入れて複数行に分けてみました。だから私は次のことをしました。

regex='/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01])
 [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3} INFO)/d'

cat copy.out | sed -r $regex >> tmp_log.txt

しかし、sedでエラーが発生し続けます。

sed: -e expression #1, char 67: unterminated address regex

echoを使用すると、正規表現文字列が改行なしで印刷されます。

echo $regex
/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]) [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3} INFO)/d

ここには非常に基本的なものが欠けているようです。私が何を間違っているのでしょうか?

答え1

式ストリングの周囲に二重引用符を使用すると、sed通常の行連続文字を使用して複数行に分割できます。

expression="/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]) \
[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3} INFO)/d"

最初の行の末尾には改行文字を1つしか含めることができず\、2行目は追加の文字で始めることはできません。誤ってインデントするのではなく、意図的にインデントしたように見えるように、文字列のスペースを最初の行に移動しました。

あるいは、単一引用符で囲まれた2つの文字列を連結することもできます。

expression='/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]) '\
'[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3} INFO)/d'

これにより、単一行文字列が変数に割り当てられますexpression

その後、次のように使用できます。

sed -E -e "$expression"

-Eここでは、より一般的にサポートされているas(拡張正規表現を有効にするために使用されます)の代わりにここを使用しています-r。シェルがその値に対してトークン化とファイル名のグロービングを実行したくないため、式自体には二重引用符が必要です。-Esed-esedsedsed

関連情報