2012-11-29 23 views
1

나는 유닉스에서 문자열로부터 패턴을 추출하기를 원했다. 어떻게 이것을 할 수 있을까?유닉스에서 문자열에서 단어를 추출

예 : 문자열 내가 ".SCR"을 검색 할 문자열의 "sv_z = sample.scr" 라고 .If 내가 그 전체 단어를 추출해야 문자열에 발견했다. 이 예제에서 출력은 sample.scr이어야합니다. 단어에 도달하는 구분 기호는 balnk 공백, 큰 따옴표 또는 동등 할 수 있습니다. 내 예상 출력있어 여기

sv_z=sample.scr 
sv_z=urhk_dbCall("sample.scr") 
sv_z="sample.scr" 

: 여기

sample.scr 
sample.scr 
sample.scr 

답변

2

하나의 방법은 grep을 사용하고 : 여기

은 몇 가지 더 예이다

grep -o '[^ "=]*\.scr' file 

설명 :

  • -o 플래그가 패턴과 정확하게 일치합니다.
  • [ ... ]은 문자 클래스입니다. 캐럿 (^)이이 클래스의 첫 번째 문자로 사용되면 클래스의 부정입니다. "다음 문자 없음"을 의미합니다.
  • *은 마지막 문자가 0, 임의의 횟수만큼 일치한다고 말합니다.

편집 : 더 엄격 필요한 경우 또는

, 당신은 펄 정규식과 positive lookahead가 필요합니다. 아래 예제에서, 일치하는 부분이 큰 따옴표, 공백 또는 줄 끝으로 이어 지도록합니다. 또한 별 (*)을 한 번 이상 일치하는 더하기 기호 (+)로 변경할 수 있습니다. 그래서 이것은 다음과 같은 것들을 걸러 낼 것입니다 : .scr. 그러나 귀하의 예제 입력 정확히 여기서 당신이 찾고있는 명확하지 않다. 행운을 빕니다.

이 awk 스크립트에서
+0

당신은 탈출해야합니다 "." 또는 "언 스크램블"에서 "언 스크"와 일치합니다. OP가 자신의 ".scr"과 일치하지 않으려면 *를 +로 변경하고 싶을 수도 있습니다. 또한 아마도 RE (아마도'([ "=] | $)와 같은 필수 종료 RE가있을 것이라고 생각합니다. 그러나".scr "와 일치하지만". "와 일치하지는 않습니다. scrabble "그러나 OP는 그것에 관해 정말로 우리에게 아직 이야기하지 않고 있었다. –

+0

@EdMorton : 감사 에드, 특히이 어떤 유효한 의견 탈출. 어떻게 든 그걸 놓쳤다. 더 엄격하게 선견지명을 추가했습니다. – Steve

0

grep -oP '[^ "=]*\.scr(?=("| |$))' file 
내가 스크립트에서 그들에게 여러 번 반복 저장할 수 구분 기호의 목록을 포함하는 변수 "D"를 사용하고 있습니다 :

$ cat file 
sv_z=sample.scr 
sv_z=urhk_dbCall("sample.scr") 
sv_z="sample.scr" 
sv_z="unscrambled" 
sv_z="sample.scrambled" 

$ awk -v d=' "=' 'match($0,"["d"][^"d"]+\.scr(["d"]|$)") { $0=substr($0,RSTART,RLENGTH); gsub("["d"]",""); print NR, $0 }' file 
1 sample.scr 
2 sample.scr 
3 sample.scr 

는 게시 된 그렙와 비교 - o 해결책 :

$ grep -n -o '[^ "=]*.scr' file 
1:sample.scr 
2:sample.scr 
3:sample.scr 
4:unscr 
5:sample.scr 

grep 출력에서 ​​원하지 않는 마지막 두 줄을 주목하십시오.

+0

이 명령은 작동하는 것처럼 보입니다. 그러나 어떤 경우에는이 명령이 여전히 실패합니다. 내가 이름 scrFilename.scr을 추출해야 위의 문자열에서 예를 'exebatch mrbx4004 $ B2K_SESSION_ID scrFilename.scr $ ListFile4 $ OutputReport $ RipFile' 를 들어, 그 나던 작동하는 것 같다. 도와주세요. –

+0

나를 위해 잘 작동합니다. 공백이 아닌 문자열 앞뒤에 탭이있을 수 있습니까? 아니면 줄이 컨트롤 -M 또는 다른 것으로 끝날 수 있습니까? 내가 게시 한 코드는 게시 된 요구 사항에 맞게 작동합니다. –

+0

답장을 보내 주셔서 감사합니다. 실수는 내 편이었습니다. 그러나 한 가지 더, 나는 패턴이 같은 줄에 두 번 이상 나오는 경우에도, 모든 stringswhic 주어진 패턴과 일치 추출해야합니다. 는 아래 코드의 예를 들어 내가'ubixres.scr'와'CheckSact.scr' 모두를 추출해야합니다. 이것이 가능한가? 'sv_q = urhk_TBAF_SetKeyScript ("bafe3012.optionblk.key-F2 | ubixres.scr || CheckSact.scr")' –

0

또 다른 해결책 :

awk -F= 'NR==1{print $2}{FS="\""}NR>1{print $2}' file