2017-12-28 3 views
1

코드 파일에서 코드 사이에있는 연속적인 흰색 선 (0 개 이상의 공백/탭과 개행을 포함 할 수있는 행)을 제거하고 싶습니다 텍스트와 결론 블록 }. 이 결론은 }에 들여 쓰기 전에 공백이있을 수 있으므로 계속 유지하려고합니다. 여기 펄 : 정규식 : 캡쳐 그룹

내가 수행하려고 할 것입니다 : 다음

□□□□while (true) {\n 
□□□□□□□□print("Yay!");□□□□□□\n 
□□□□□□□□□□□□□□□□\n 
□□□□}\n 

내가이되고 싶어 : 내 코드 파일과 같은 경우 예를 들어

perl -i -0777 -pe 's/\s+\n([ ]*)\}/\n($1)\}/g' file 

(□ 공백 문자입니다) :

□□□□while (true) {\n 
□□□□□□□□print("Yay!");\n 
□□□□}\n 

그러나 예상대로 변경되지 않았습니다. 내가 여기서 뭘 잘못하고 있는거야?

+0

아마도 정규 표현식이이 도구가 아닙니다. IDE가 이런 방식으로 서식을 정리할 때, 파서를 사용합니다 (그리고 컴파일 중일 수도 있습니다). –

+0

@TimBiegeleisen 모든 사례를 삭제하는 스크립트를 통해 파일을 실행하기 때문에 이러한 사례가 발생합니다. 그래서 같은 스크립트로 정리하고 싶습니다. – rapt

+2

코드 펄은 무엇입니까? 그럼 난 perltidy지고 사용하는 것이 좋습니다. – Sobrique

답변

0

대신에 긍정적 인 표정 어서션을 사용하는이 정규식을 사용해보십시오. 이 방법으로 만 제거 할 부분을 캡처하고 아무것도로 교체 :

s/\s+(?=\n[ ]*\})//g 
+0

거의 다 거기 -'\ n'을 미리보기로 옮겨야한다고 생각합니다. 그렇지 않으면 제거 될 것입니다. – rapt

+0

아 맞아, 고마워! 업데이트 됨. – Marathon55

-1

당신은 시도 할 수

perl -0777 -pe 's/\s*\n*(\s*\n)/$1/g' test 
+0

거의 다 그렇지만'}'바로 위에 있지 않은 다른 흰색 선도 제거합니다. – rapt

1
perl -pi -0777 -e's/^\s*\n(?=\s*})//mg' yourfile 

가 (처음부터 공백을 제거 다음과 같은 하나 라이너 공백이 아닌 첫 번째 공백으로 괄호 앞에 공백이있는 행을 맨 처음 줄 바꿈 문자를 사용합니다.

1

정규 표현식에서 볼 수있는 유일한 문제는

입니다. 0
  • 당신이 일치하는 변수 주위에 괄호가 필요하지 않습니다 및
  • 문자 클래스의 사용 (당신은 공간뿐만 아니라 탭과 일치하지 않으려면) 경기를 추출하는 중복입니다.

그래서, 당신은 대신

s/\s+\n(*)\}/\n$1\}/g 

을 시도 할 수 있습니다.

테스트 입력에서 예상대로 작동합니다.

더 정리하려면 다음을 시도해보십시오.

s/\s+(\n *\})/$1/g 

탭과 공백이있을 수있는 경우 문자 클래스를 사용할 수 있습니다. 문자 클래스 안에 '|'를 포함 할 필요는 없습니다.

s/\s+(\n[ \t]*\})/$1/g 
+0

그룹 확장을위한 아이디어에 감사드립니다. 나는'$ 1'을 사용할 때 괄호로 왜곡하지 말라고 알았습니다. :) 또한 내 경우에는 들여 쓰기가 탭으로 이루어 졌으므로 버전과 함께 s/\ s + (\ n [| \ t] * \})/$ 1/g' – rapt

+0

@rapt : 안녕하세요. 대체 메타 문자가 필요하지 않습니다. 캐릭터 클래스 내부. 그래서 아마도's/\ s + (\ n [\ t] * \})/$ 1/g'으로 충분할 것입니다. 행운을 빕니다. –