멀티 린 정규 표현식 및 Windows 파일로 출력
문제
특정 패턴을 추출 해야하는 로그 파일이 있습니다. 새 파일로 찾아 처리해야합니다. Linux의 Grep은 일반적으로 트릭을 수행하지만 정규 표현식은 여러 줄에 걸쳐 있습니다.
다음은 로그/디버그 파일의 예입니다.
Da:
1.328 0.5045
Db:
0.6415 0.1192
Lambda:
0.4429 -0.35
-0.0461 -0.02421
seps:
0.714272
내가 찾고 있어요 /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/
그런 다음 선을 새 파일로 출력하여 Lambda를 제거하고 숫자를 동일한 줄로 재 배열하여 출력을 원합니다. \1\s\2\s\3\s\4\n
그래서 저는 실제로 두 가지 질문이 있습니다.
- 어떤 시스템에서도이를 달성하기 쉬운 유틸리티가 있습니까?
- Windows에서 구체적으로 수행 할 수있는 방법이 있습니까?
나는 나를 탈출 한 간단한 해결책이 있기를 바라고있다. 차라리 창문에 머물고 싶지만 리눅스에 가야한다면이 작업을 수행 할 것입니다.
해결책 3
모든 답변에 감사드립니다. 나는 당신이 Perl과 Awk에 대해 나에게 준 답을 좋아합니다. 나는 Perl을 모르는 이상한 프로그래머 중 하나이므로 루비 노선을 가져갔습니다. 여기 내 해결책이 있습니다
x=ARGV[0]
f=File.new(ARGV[1])
g=File.new(ARGV[2],"w")
f.read.gsub(/#{x}:\s*(([\d\.\-]*\t*)+\n)+/ ){|entry|
puts entry
g.puts entry.gsub(/#{x}:\n/,'').gsub(/\s+/,"\t").strip
}
이것은 내가 아는 한 리디렉션 및 배관을 지원하지 않는 NPPEXEC를 통해 편집기 Notepad ++와 함께 유틸리티로 사용할 수 있습니다. 이것은 또한 프로그램별로 진단 해야하는 출력을 수집 할 수 있습니다. 다시 한 번 감사드립니다.
다른 팁
이것은 좋은 후보입니다 awk
, perl
그리고 같은 상태가 많은 구문 분석 (이것들은 두 창 모두에서 실행됩니다 CMD.EXE
, 당신이 가지고있는 경우 perl
및/또는 awk/sed
당신의 PATH
, 물론 Linux 및 기타 유엔에서도) :
awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file >output_file
또는
perl -ne "chomp; if (/^Lambda/) { $in_lambda = 1 } elsif ($in_lambda && /^ *$/) { $in_lambda=0 ; printf \"\n\" } elsif ($in_lambda) { printf \"%s \", $_ }" input_file >output_file
필요한 경우 두 번째 패스를 수행하여 공백을 정상화하고 (라인 끝에서 공백을 트림)를 수행 할 수 있습니다.
awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file
| sed -e "s: *: :g" -e "s: *$::" >output_file
또는
perl -ne "chomp; if (/^Lambda/) { $in_lambda = 1 } elsif ($in_lambda && /^ *$/) { $in_lambda=0 ; printf \"\n\" } elsif ($in_lambda) { printf \"%s \", $_ }" input_file
| perl -ne "s/ +/ /g; s/ +$//g; print" >output_file
Perl, Python, Ruby 또는 PHP를 설치하고 스크립트를 상당히 쉽게 쓸 수 있습니다.