sed: 정규 표현식이 포함된 줄 삭제

sed: 정규 표현식이 포함된 줄 삭제

내 로그 파일에 다음이 있습니다.

[2.09 10:23:56] 
[23.09 10:3:56] 
[23.09 10:23:56] Some other thing
[23.09 10:23:56] 
[23.09 10:23:56] 
[23.09 10:23:5] 
[23.09 10:23:56] Something
[23.09 10:23:56] 

sed를 사용하여 "빈" 줄(타임스탬프만 포함하는 줄)을 제거하려고 합니다. 나는 다음을 시도했습니다 :

sed -i '/\[\d{1,2}\.\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\] ($|\R)/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] \n/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] ($|\R)/d' file

하지만 아무것도 작동하지 않는 것 같습니다.

도움을 주시면 감사하겠습니다!

답변1

내가 아는 한, 줄 시작 부분의 괄호 안의 날짜 문자열과 일치하는 표현식을 만들 필요가 없습니다.

$ grep -v -x '\[[^]]*\][[:blank:]]*' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something

위의 명령은 [like this]대괄호로 묶인 문자열( )로 시작하고 선택적 후행 공백만 포함하는 줄을 제거합니다.

그걸로 sed, 이것은 다음과 같습니다

$ sed '/^\[[^]]*\][[:blank:]]*$/ d' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something

표현식은 \[[^]]*\]리터럴로 시작하고 [그 뒤에 0개 이상의 비문자가 오고 ]마지막으로 리터럴이 옵니다 ].

를 사용하여 awk필드 구분 기호를 로 설정할 수 있습니다 ][[:blank:]]*. 즉, ]끝에 있는 타임스탬프(및 그 뒤의 모든 공백)가 두 필드 사이의 구분 기호가 됩니다. 두 번째 필드가 비어 있으면 현재 줄을 인쇄하지 않습니다.

$ awk -F '][[:blank:]]*' '$2 != ""' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something

~처럼콰지모도awk 'NF > 2' file을 사용하면 질문에 제공된 예제 데이터에서도 작동한다는 의견 (현재 삭제됨)에서 지적되었습니다 . 이 방법은 awk기본적으로 행이 빈 필드로 분할된다는 사실에 의존합니다. 이 변형은 각 행의 세부정보를 고려하지 않으며 공백으로 구분된 필드가 2개 이상인 행을 제외한 모든 행을 삭제합니다.

답변2

sed '/^\[[0-9]\{1,2\}\.[0-9]\{1,2\} [0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}\] $/ d'
  • sed는 지원되지 않습니다 \d.
  • 수량자는 {...}백슬래시로 묶어야 합니다( 를 사용하지 않는 한 -E).
  • 대안은 |백슬래시여야 합니다( -E사용 하지 않는 한).
  • 선택적 기호는 ?백슬래시여야 합니다( -E사용 하지 않는 한).

관련 정보