2014-09-18 4 views
0

두 개의 연속 패턴 일치마다 앞뒤에 문자열을 추가하려면 어떻게해야합니까?두 개의 연속 패턴 일치마다 앞뒤 문자열 추가

예를 들어 :

if (a == 5) 
    `uvm_info ("some display message"); 

가 여기에 두 개의 연속 된 패턴이 "만약"과 "uvm_info"이다 : 나는 다음과 같은 몇 가지 코드가 있습니다. if와 uvm_info가 연속적으로 나오는 경우에만 "begin"과 "end"를 추가해야합니다.

는 지금은

if (a==5) 
    begin 
    `uvm_info ("some display message") 
    end 

내가 말을 시작할 추가 할 수 있습니다처럼이의 매칭을 고려하지 않아도 쉽게 경우 출력이 원하는 패턴은 다음 명령을 사용하여 "경우"

awk '/`uvm_info/{print "begin"; print; print "end";next}1' test_file 

을 하지만 "if"패턴을 처리해야하고 가능한 경우 uvm_info와 같은 들여 쓰기를 설정하고 싶습니다.

아무도 도와 줄 수 있습니까?

답변

0

약간의 조정은

awk 'x&&/`uvm_info/{$0=(y=substr($0,1,index($0,"`")-1))"begin\n"$0"\n"y"end"}{x=0}/if/{x=1}1' 
+0

고마워 이것이 나를 위해 일했다 :) –

+0

우리는'uvm_info뿐만 아니라 begin end의 들여 쓰기와 일치시킬 수 있는가? –

+0

@NavdeepSingh가 더러운 해결 방법을 추가했습니다. –

0

이 정규 표현식을 수행합니다

s/(if[^;]+?)\s+(.*?uvm.*?);/\1\nbegin\n \2;\nend/gm 

http://regex101.com/r/mD7gK4/3

편집 : 입력 :

if (a == 5) 
    `uvm_info ("some display message"); 

if (hello) 
    `uvm_info ("some display message"); 

if (answer_toeverything == 42) 
    `uvm_info ("some display message"); 

uvm_info ("some display message"); 

uvm_info ("some display message 

출력 :

if (a == 5) 
begin 
    `uvm_info ("some display message"); 
end 

if (hello) 
begin 
    `uvm_info ("some display message"); 
end 

if (answer_toeverything == 42) 
begin 
    `uvm_info ("some display message"); 
end 

uvm_info ("some display message"); 

uvm_info ("some display message"); 

나는 백틱으로 무엇을해야할지 모르겠다. (우연히 예를 든다면). 바깥에서 이것을 억제하려면 검색 결과로 (if[^;]+?)[^;]*?(uvm.*?);을 대신 사용할 수 있습니다 (http://regex101.com/r/mD7gK4/5).

당신은 펄이 방법으로 파일이 정규식을 적용 할 수 있습니다 설치 한 경우 : 첫 번째는 표준 입력에서 모든 행을 읽고 하나의 문자열로 합류, 정규식을 적용하고 결과를 출력

perl -e "$_ = join('',<>); s/(if[^;]+?)[^;]*?(uvm.*?);/\1\nbegin\n \2;\nend/gm; print" 

. 코드에

+0

는 빠른 응답 해 주셔서 감사가

awk 'x&&/'uvm_info/{print "begin\n"$0"\nend";next}{x=0}/if/{x=1}1' file 

들여 쓰기를 유지 할 것. 하지만 당신이 보여준 정규 표현식을 사용할 수 없습니다. 나는 그것을 sed 또는 awk 또는 다른 방법으로 사용해야합니까? 죄송합니다. 스크립팅에 능숙하지 않습니다. 그리고이 질문을 어리석게 여기면 사과드립니다. 백틱이 있습니다. 나는 두 번째 시간을 더하는 것을 잊었다. –

+0

@NavdeepSingh perl one liner를 추가했습니다. 나는 입력 행을 현명하게 처리하고'awk'에 대해서는 거의 알지 못하기 때문에 그것의 할 수있는 지혜가'sed'인지 모른다. –

+0

답장을 보내 주셔서 감사합니다. 나는 그것을 perl을 사용하여 시도 할 것이다. 고마워요 !! –