로그 파일에서 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
표현식 string 주위에 큰따옴표를 사용하면 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"
첫 번째 줄 끝 뒤에는 개행 문자가 하나만 있을 수 있으며 \
, 두 번째 줄은 추가 문자로 시작할 수 없습니다. 실수로 들여쓰기한 것이 아니라 의도적으로 들여쓰기한 것처럼 보이도록 문자열의 공백을 첫 번째 줄로 옮겼습니다.
또는 작은따옴표로 묶인 두 문자열을 연결할 수도 있습니다.
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
있으며 다음 인수를 알리기 위해 using을 사용하는 것은 입력에 적용할 표현식입니다. 쉘이 해당 값에 대해 토큰화 및 파일 이름 글로빙을 수행하는 것을 원하지 않기 때문에 표현식 자체에는 큰따옴표가 필요합니다.-E
sed
-e
sed
sed
sed