2013-03-22 3 views
1

CVS 병합 충돌을 얻으려면 명령/스크립트가 필요합니다. 기본적으로, 나는 두 세트 패턴 사이에만 라인을 인쇄 할 SED 나 AWK 명령을 필요두 세트 패턴 사이에있는 행만 인쇄하는 SED 또는 AWK 명령

예 :

Pattern1="RCS file:" 
Pattern2="conflicts during merge" 

내가하려고하면 간단한 SED 명령과 같은 :

sed -n '/RCS file:/,/conflicts during merge /p' INPUT.txt 

I 예상되는 출력이 나오지 않습니다. "filename2 및 filename3"에 대한 세부 정보 만 캡처하려고합니다 (병합 중에 충돌이 있음).

누군가 도와 드릴 수 있습니까?

INPUT.txt 

RCS file: /hello/filename1 
retrieving revision 1.4.2.1.18.2.2.1 
retrieving revision 1.4.2.1.18.2.2.1.4.2 
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename1 

RCS file: /hello/filename2 
retrieving revision 1.4.2.1.18.2.2.1 
retrieving revision 1.4.2.1.18.2.2.1.4.2 
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename2 
rcsmerge: warning: conflicts during merge 

RCS file: /hello/filename3 
retrieving revision 1.6.18.1.2.1.2.1 
retrieving revision 1.6.18.1.2.1.2.1.4.3 
Merging differences between 1.6.18.1.2.1.2.1 and 1.6.18.1.2.1.2.1.4.3 into filename3 
rcsmerge: warning: conflicts during merge 

RCS file: /hello/filename4 
retrieving revision 1.4.2.1.18.2.2.1 
retrieving revision 1.4.2.1.18.2.2.1.4.2 
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename4 

(Expected) OUTPUT.txt 

RCS file: /hello/filename2 
retrieving revision 1.4.2.1.18.2.2.1 
retrieving revision 1.4.2.1.18.2.2.1.4.2 
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename2 
rcsmerge: warning: conflicts during merge 

RCS file: /hello/filename3 
retrieving revision 1.6.18.1.2.1.2.1 
retrieving revision 1.6.18.1.2.1.2.1.4.3 
Merging differences between 1.6.18.1.2.1.2.1 and 1.6.18.1.2.1.2.1.4.3 into filename3 
rcsmerge: warning: conflicts during merge 

답변

1

귀하의 sed 명령은 'RCS 파일'을보고는 '갈등'마커를 볼 때 정지 할 때마다 출력 시작합니다. 따라서 모든 것을 거의 출력합니다. sed로 원하는 것을 할 수는 있지만 복잡합니다. awk는 훨씬 간단합니다 : 빈 줄 레코드의

awk -v RS= '/conflicts/ {print $0}' INPUT.txt 

사용 AWK의 개념을 분리하고, 기본적으로 각 레코드를 grep을. 따라서 두 패턴 사이에 줄을 인쇄하지 않고 특정 패턴과 일치하는 각 줄 블록을 인쇄합니다. 여기

+0

내가 awk 명령을하려고 할 때, 내가 할 다음과 같은 오류 ...
AWK : 입력 라인 RCS 파일 :/was_apps/이상 3,000 바이트를 초과 할 수 없습니다. – katewadi

0

당신은 힌트를 가지고 :

awk '{if ($1=="HO") i=1}; {if ($1=="JOU") i=0}; i{print}' file 

예 :

Pattern1="HO" 
Pattern2="JOU" 
awk -v p1=${Pattern1} -v p2=${Pattern2} '{if ($1==p1) i=1}; {if ($1==p2) i=0}; i{print}' file 
HO 
JE 

사건을 바탕으로

$ cat file 
HI 
HO 
JE 
JOU 
LA 

그래서,

Pattern1="RCS file:" 
Pattern2="conflicts during merge" 

$ awk -v p1=$(Pattern1) -v p2=${Pattern2} '{if ($1==p1) i=1}; {if ($1==p2) i=0}; i{print}' file 

편집

이 텍스트를이 포함 된 문자열 를 찾을하려는 경우, 당신은 이런 식으로 작업을 수행 할 수 있습니다

Pattern1="RCS file:" 
Pattern2="conflicts during merge" 

$ awk -v p1=$(Pattern1) -v p2=${Pattern2} '{if ($1 ~ p1) i=1}; {if ($1 ~ p2) i=0}; i{print}' file 
+0

이것은 정확히 제출자가 요구 한 것이지만 원하는 것은 아닙니다. 첫 번째 패턴을 볼 때 인쇄를 시작하지만 인쇄해야하는 경우 메시지의 끝까지 알 수 없습니다. –

+0

예, 이제 @evilotto가 보입니다. 나는 라인이 *이 텍스트를 포함하고 있다는 것을 고려하여 나의 대답을 업데이트했다. – fedorqui

0

브로,

사용 egrep을을 ..... 그것을 간단하고, SED와 AWK에 대해 걱정할 필요가 없습니다. 그것 여기에 원하는 라인의 고정 된 패턴 ....

여기
egrep +B4 conflict INPUT.txt 

B 옵션 (GNU의 egrep을을 사용하여 메신저) 패턴

일치하는 라인과 함께 경기 전에 4 개 라인을 인쇄 egrep을 출력 : 여기에

RCS file: /hello/filename2 
retrieving revision 1.4.2.1.18.2.2.1 
retrieving revision 1.4.2.1.18.2.2.1.4.2 
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename2 
rcsmerge: warning: conflicts during merge 
-- 
RCS file: /hello/filename3 
retrieving revision 1.6.18.1.2.1.2.1 
retrieving revision 1.6.18.1.2.1.2.1.4.3 
Merging differences between 1.6.18.1.2.1.2.1 and 1.6.18.1.2.1.2.1.4.3 into filename3 
rcsmerge: warning: conflicts during merge 
0

당신은 이동 :

sed -n '/RCS file:/ !{H;d}; /RCS file:/ {x; /conflict/p}; $ {x; /conflict/p}' input.txt 

모든 리튬 들어 ne는 'RCS file :'과 일치하지 않습니다. - 공간을 유지하기 위해 추가하십시오.행과 일치하면 (또는 파일의 끝) 패턴 공간을 보류 공간으로 바꾸고 '충돌'과 일치하는지 확인하십시오. 인쇄 할 경우 인쇄하십시오.

분기를 사용하면 더 간단해질 수 있습니다. 이처럼

:

sed -n '$ba; /RCS file:/ba; H; d; :a; x; /conflict/p' input.txt 
+1

'sed -n '/^$ /! {H; $! d}; x;/병합 중 충돌 $/p " – jthill

+0

sed : 함수/RCS 파일 : /! {H; d};/RCS 파일 :/{x;/conflict/p}; $ {x;/conflict/p}를 파싱 할 수 없습니다. – katewadi

+0

@jthill
SED 명령을 실행할 때 followin 오류가 발생합니다 ...
katewadi