2013-04-25 3 views
1

다른 문자열 앞에 앞의 문자열을 찾으려고합니다. 예를 들면 다음과 같습니다.Bash : 파일에서 다른 문자열 앞에있는 문자열 찾기

StringA <stuff 1> 
StringA <stuff 2> 
StringD 
... 
StringB <stuff 3> 
StringA <stuff 4> 
StringA <stuff 5> 
StringA <stuff 6> 
StringD 
StringB <stuff 7> 

파일에서 StringB보다 먼저 선행하는 모든 "StringA"를 찾고 싶습니다.

이 예제의 출력은 다음과 같습니다 내가 사용하여 모든 StringB의 줄 번호를 발견 할 수 있어요

StringA <stuff 2> 
StringA <stuff 6> 

: 그렙 "을 StringB"-n

그럼 내가 나오지도 사용할 수 있습니다 -n 1, $ line_numberp는 1 행에서 StringB 행으로 이동합니다. grep "StringA"| tail -n1

이것은 작동하는 것처럼 보이지만 조금 성가시다. 원하는 결과를 얻을 수있는 더 좋은 방법이 있습니까? 의견

+0

4 및 5는 어떨까요? 내가 아는 한 그것들은 B만큼 앞선다. – squiguy

+0

나는 stringB 이전의 유일한 마지막 것을 찾고있다. – user1777907

답변

1

AWK와 :

awk '/^StringB/ { if(lastline ~ /^StringA/) {print lastline }} {lastline=$0}' $file 

이 StringA 및 StringB 정규식이 될 수 있습니다.

+0

대단히 감사합니다! – user1777907

+0

한 가지 문제는 파일의 마지막 줄이 StringA이고 그 뒤에 StringB가없는 경우 마지막 StringA를 인쇄하는 것입니다. 감사. – user1777907

1
sed '/String[AB]/!d' input | 
    sed -n -e '/StringA/{:l /StringA/h;n;/StringB/{x;p;b};bl}' 

:

sed '/String[AB]/!d' input |  # remove lines not containing StringA/B 
    sed -n -e '/StringA/{   # if line contains StringA, then 
     :l       # loop until StringB 
      /StringA/h;    # keep the most recent A in the hold space 
      n;      # read a newline (overwrite pattern space) 
      /StringB/!bl;   # loop up... 
      x;p;b     # get the most recent A, and print 
    }' 
+0

나는 그 sed 스크립트를 썼 으면 좋겠다! – user1666959

3
grep "\(StringA\|StringB\)" $file_name | grep -B 1 StringB | grep StringA 
+0

대단히 감사합니다! – user1777907

+1

@perreal 나는 그것에 대해 생각했지만 사용하지 않았다. 왜냐하면 op가 문자열 [AB]'와 일치하는 실제 문자열에 대해 묻고 있기 때문이다. – Alex

0

당신 (GNU이 나오지도)에 대한이 작동 될 수 있습니다

sed ':a;$!N;/^StringA/!D;/^\(StringA\).*\n\1/D;/.*StringB/!ba;P;D' file 

StringA 라인의 마지막을 유지하고 StringB 라인 패턴 영역의 첫 번째 문자열을 출력 발생하면 중복 제거합니다.

관련 문제