2016-06-11 3 views
1

나는 정글이있는 파일이 있습니다. 다음과 같이 몇 줄 읽기 :파일의 각 줄에서 특수 문자로 특정 문자열을 추출하는 방법

2*H[0, 3, y]*Log[1 - z] - 2*H[2, 3, y]*Log[1 - z] + 
6*H[2, 2, 0, y] + 6*H[2, 2, 2, y] - 48*Log[-Q2] + 12*zeta2*Log[-Q2] + 
(-107 + 12*N^2*(-1 + N^2))*z^2))*(H[0, 1, 0, y] + H[0, 1, 0, z] + ... 

내가 각 라인에서 오는

H[*,*,*] or H[*,*,*,*] 

의 서로 다른 고유 한 조합을 찾고 싶어요. 따라서 특수 문자가 포함 된 문자열을 검색해야합니다. 쉘로 할 수있는 방법이 있습니까?

답변

2

는 사용자 정의 RS으로이 GNU awk 명령을 사용할 수 있습니다

awk -v RS='H\\[[^]]*\\]' 'RT && !seen[RT]++{print RT}' file 

H[0, 3, y] 
H[2, 3, y] 
H[2, 2, 0, y] 
H[2, 2, 2, y] 
H[0, 1, 0, y] 
H[0, 1, 0, z] 

정규식 H\\[[^]]*\\]는 레코드 분리로 H[...]의 각 인스턴스를 설정합니다.

+0

안녕하세요 @anubhava .. 감사합니다. 그것은 상자에서 작동합니다. 그러나 일반적인 문자열 ("H"와 같은)에 대한 일부 기능으로 bash에 넣는 방법이 있습니다. 같은 것 기능 테스트() {awk -v RS = "$ @ \\ [[^]] * \\]" 'RT &&! 본 [RT] ++ {print RT}'$ @;} –

+0

죄송합니다. , 나는 그것이 작동하도록하지 않았다. bashrc에 답변을 넣어서 모든 문자열과 파일에 사용할 수 있습니까? 비슷한 것을 시도했습니다. myfunc() {awk -v RS = 'H \\ [[^]] * \\]' 'RT &&! [RT] ++ {print RT}'$ @;} 그래서 나는 다음과 같이 실행한다 : myfunc file 그리고 올바른 결과를 준다. 그러나 "H"에 대한 프롬프트 입력을주고 싶기 때문에 일반 문자열에 사용할 수 있습니다. –

+1

'.bashrc '안에'myfunc() {awk -v RS = "$ 1"'\\ [[^]] * \\] ''RT &&! seen [RT] ++ {print RT} '; }'그런 다음 그것을'cat file | myfunc 'H'' – anubhava

관련 문제