2016-08-07 6 views
-2

필자는 Perl에 ls을 파이핑 중입니다. 줄 끝에 ".mp4.mp3"이 오는 문자가있는 줄을 찾습니다. 나는 라인의 중간에서 ".mp4"를 제거하고 싶다. 정규식은 ".mp4.mp3"에 실행될 때 라인을 소비 중지 있도록펄 정규식 비 탐욕적 인 일치

ls | perl -pe 's|(.+?)\.mp4\.mp3$|\1\.mp3|' 

것은 내가 아닌 욕심 매칭을 사용하고 있습니다 : 여기 내 명령입니다. 나는 이것이 ".mp4.mp3"으로 끝나는 라인에서만 작동 할 것으로 기대할 것입니다. 그러나 그것들 안에 ".mp4"가없는 라인들에서 작동합니다.

입력 : foo. bar.mp4.mp3

예상 출력 : foo. bar.mp3

+0

eason 당신은 단지'.mp4.mp3'을'.mp3'으로 대체하지 않습니까? – Laurel

+2

샘플 입력과 예상 및 실제 출력 – ysth

+0

은 항상 oneliner에서 경고를 활성화해야합니다. 여기서 실제 문제는 아니지만 대체 오른쪽에 $ 1 대신 \ 1을 사용하면 오류가 발생합니다. – ysth

답변

3

를 '전혀 그들에 ".MP4"없이 라인에서 작동'으로 대체 파일 이름 만 변경하려고하면 파일 이름을 -p를 사용하지 않고 명시 적으로 인쇄해야합니다. 원하는 파일을 명시 적으로 인쇄해야합니다.

ls | perl -wne'print if s/\.mp4\.mp3$/.mp3/' 
+0

나는 결국 xargs -n2 mv에이 파이프를 연결하려고 시도했다. 보통 sed로한다. (하지만 sed는 욕심이 많지 않다. 정말 필요하지 않다.)하지만 나는 -p가 모든 라인을 sed p는 교체가 일어나는 라인을 출력한다. Perl은 -i 옵션을 사용하여 파일을 처리 할 수 ​​있지만이 파일은 어떻게 사용합니까? – crazyfox

+0

내 대답이 도움이되지 않습니까? 장소 편집도 할 수 있지만 xargs를 사용하려는 경우에는 도움이되지 않습니다. – ysth

+0

기다리십시오. mv가 이전 이름과 새 이름을 모두 인쇄하여 이름을 변경하려고합니까? ('. *) \ .mp4 \ .mp3) $/$ 1 \ n $ 2.mp3 /'를 출력하면됩니다. 또는 더 나은 방법은 perl 대신에 rename 명령을 사용하는 것입니다. – ysth

1

그것을 overthink하지 마십시오 :

s/\.mp4\.mp3$/.mp3/ 

펄에있는 파일의 이름을 변경하는 경우

ls | perl -lne '($newname = $_) =~ s/\.mp4\.mp3$/.mp3/; rename($_, $newname)'