2012-12-18 2 views
0

추가 :펄 패턴 일치와 나는 다음과 같은 번역을 달성하고자하는 펄에서

stmt1; gosub xyz; 

나는이 작업을 수행 할 수있는 방법
stmt1; xyz(); 

에를? 편집 할 파일 (replaceing있는 file.ext)에 명령 줄에서

+0

참조 http://www.comp.leeds.ac.uk/Perl/sandtr.html – Himanshu

+0

";"을 사용하여 줄을 분할하려고했습니다. 그런 다음 패턴이 발견되면 교체하려고했습니다. $ line = ~ m/$ pattern_gosub (. *?) (\;) * $ /; $ line = ~ s/$ pattern_gosub //; $ line = ~ s/$ 1/$ 1 \ (\) \; /; 하지만 작동하지 않았습니다. – user1912265

답변

1

이미 approximative 답을 제공하고 주어진 답변을,이 에지의 경우 처리됩니다 (세미콜론이 누락 된 경우, 세미콜론 다음에 추가 절).

perl -plwe 's/\bgosub\s+([^;]+)/$1()/g' 

그것은 "아니 세미콜론"하고 제거 공백 다음에 gosub 키워드 뒤에 문자의 순서와 일치합니다. /g 글로벌 수정 자도 추가했습니다. 모든 행을 하나의 행에서 처리하려고 할 가능성이 높습니다. 부분 일치를 방지하려면 단어 경계 \b을 사용하십시오. legosub을 대체하지 마십시오.

단어 경계가 충분하지 않은 경우 (예 : .는 단어 문자 사이에 틈이 발생하기 때문에이 1.gosub를 대체, 대신 부정적인 lookbehind을 사용할 수 있습니다

perl -plwe 's/(?<![^;\s])gosub\s+([^;]+)/$1()/g' 

gosub 전에 모든 문자는 세미콜론 또는 공백을 제외하고 아무것도 아니라는 것을 요구한다. 이중 부정은 또한 불일치 (라인의 시작)를 허용한다는 것을 유의하십시오.

+0

정말 고마워요. 그것은 내가 만난 모든 조건에 적용됩니다 – user1912265

+0

@ user1912265 여러분을 환영합니다. 문제를 해결했다고 판단되면 옆에있는 체크 표시를 클릭하여 대답을 "수락 된"것으로 표시 할 수 있습니다. – TLP

0
my $str = 'stmt1; gosub xyz;'; 
$str =~ s/gosub (.*?);?/$1();/; 

print $str; 
+0

고마워요. 세미콜론이 누락 된 행은 거의 없으며,이 경우 어떤 변경을해야합니까? – user1912265

+0

추가; regexp하려면 도움이 될 것입니다 –

1

실행 :

perl -i.bk -pe 's/gosub (.*?);/$1()/g' file.ext 
+0

도움 주셔서 감사합니다. 세미콜론이 누락 된 행이 거의 없으며,이 경우 어떤 변경을해야합니까? – user1912265

+0

자, 함수 이름의 끝으로 간주 될 무언가가 필요합니다. 그냥 개행이라면 다음과 같이 쓸 수 있습니다 :'perl -i.bk -pe '/ gosub (. *?) \ n/$ 1() \ n/g'file.ext' – Ilion

+0

gosub 다음의 또 다른 성명이 있어야합니다. 처음에는 지정하지 않으셔서 죄송합니다. 그래서 그 줄은 stmt1 일 수 있습니다. gosub foo; stmt2; 또는 stmt1 일 수도 있습니다. gosub foo – user1912265

관련 문제