Eu tenho uma string de padrão regex realmente grande que estou usando para excluir mensagens INFO de um arquivo de log. Quando eu uso isso tudo em uma linha como a seguinte, funciona bem:
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
Mas, como você vê, isso é difícil de ler, então tentei colocá-lo em variável e dividi-lo em várias linhas. Então eu fiz o seguinte:
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
Mas continuo recebendo o erro do sed:
sed: -e expression #1, char 67: unterminated address regex
Quando uso echo, a string regex é impressa sem quebras de linha.
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
Parece que estou perdendo algo extremamente básico aqui, o que estou fazendo de errado?
Ao usar aspas duplas em torno de sua
sed
string de expressão, você pode usar a continuação de linha comum para dividi-la em várias linhas:Não deve haver nada além de uma nova linha após
\
o final da primeira linha, e a segunda linha não deve começar com nenhum caractere extra. Movi o espaço na corda até a primeira linha para fazê-la parecer deliberada e não como um recuo acidental.Alternativamente, você pode usar a concatenação de duas strings entre aspas simples:
Isso atribuirá uma única string de linha à variável
expression
.Você então usaria isso como
Aqui estou usando
-E
aqui no lugar de-r
como-E
é mais comumente suportado (para habilitar expressões regulares estendidas emsed
) e usando-e
para informarsed
que o próximo argumento é ased
expressão a ser aplicada à entrada. Ased
expressão em si precisa estar entre aspas duplas, pois não queremos que o shell execute divisão de palavras e globbing de nome de arquivo em seu valor.