ログファイルから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
。シェルがその値に対してトークン化とファイル名のグロービングを実行したくないため、式自体には二重引用符が必要です。-E
sed
-e
sed
sed
sed