여러 정규식을 유효한 한 줄로 압축할 수 없습니다. 내 파일 이름은 다음과 같습니다: Something (0482) - a123b456 - Something [00xcf bxc v32 Something]
.결과를 something-a123b456-Something
다음과 같이 지정하고 싶습니다.something_-_a123b456_-_Something
압축하려는 정규식은 다음과 같습니다.
's/(^.*)/\L\1/' # makes the whole string lowercase
's/\(.*?\)|_//gs' # removes everything between parentheses
's/\[.*?\]|_//gs' # removes everything between square brackets
's/ /_/g' # substitutes whitespaces with underscores
수동으로 또는 다음을 사용하여 명령을 함께 연결해 보았습니다.이 웹사이트, 그러나 정규식은 다음과 같습니다.아니요나의 강점. 누가 알려주시면 정말 감사하겠습니다어떻게하나는 여러 명령을 함께 연결하여 다음에 직접 실행할 수 있도록 하는 것입니다.
prename
참고로 저는 (Perl)을 사용하고 있습니다.
답변1
일반적으로 Perl 표현식은 암시적 변수에 대해 작동하는 스타일 연결을 달성하기 위해 ;
so와 함께 연결됩니다 . 이 내용을 어디서 얻는지 잘 모르겠으므로 다음을 사용하겠습니다.s/.../foo/;s/.../bar/;...
rename
$_
prename
내 자신의 버전여기 rename
. 어쩌면 당신과 매우 비슷할 수도 있습니다. 이 -p
플래그는 미리보기 또는 파일 시스템 손상을 방지하는 데 사용됩니다.
$ touch 'Something (0482) - a123b456 - Something [00xcf bxc v32 Something].demo'
$ rename -p 's/(^.*)/\L\1/;s/\(.*?\)|_//gs;s/\[.*?\]|_//gs;s/ /_/g' *.demo
rename Something (0482) - a123b456 - Something [00xcf bxc v32 Something].demo something__-_a123b456_-_something_.demo
그러나 이는 아마도 개선될 수 있습니다. 여기서는 모든 것에 정규식을 사용할 이유가 없습니다.
$ rename -p '$_=lc; s/\(.*?\)|_//gs;s/\[.*?\]|_//gs; tr/ /_/' *.demo
rename Something (0482) - a123b456 - Something [00xcf bxc v32 Something].demo something__-_a123b456_-_something_.demo
따라서 $_=lc
의 모든 내용을 소문자 로 $_
바꾸고 . 아니면 연속된 공백을 하나의 밑줄로 바꿔야 할까요? 만일이 경우라면, . 균형 조정 표현식의 올바른 일치는 더욱 복잡해지지만 여전히 개선될 수 있습니다 .s/ /_/
tr
s/\s+/_/g
()
[]
추가 연구에는 별 의미가 없습니다. 표정을 번갈아 가며 죽이지 않고 (반복!) 캐릭터를 s/\(.*?\)|_//gs
죽이는 더 좋은 방법이 있습니다 ._
()
[]
$ rename -p '$_=lc; tr/_//; s/\(.*?\)//gs;s/\[.*?\]//gs; tr/ /_/' *.demo
rename Something (0482) - a123b456 - Something [00xcf bxc v32 Something].demo something__-_a123b456_-_something_.demo
"끝 문자가 아닌 문자만 일치"와 같은 것을 사용하여 효율성을 얻을 수도 있지만 효율성보다 가독성을 더 원할 수도 있습니다 .*?
. s/\([^)]*\)//gs
그러나 한 줄의 코드에서 정규식을 사용하면 가독성 예산을 초과하게 됩니다.
$ rename -p '$_=lc; tr/_//; s/\([^)]*\)//g; s/\[[^\]]*\]//g; tr/ /_/' *.demo
rename Something (0482) - a123b456 - Something [00xcf bxc v32 Something].demo something__-_a123b456_-_something_.demo