특수문자를 모두 제거하고 A-Za-z0-9만 남기고 싶습니다.()[]
echo 'Some Movie Name! (2015) [1080p]' |sed -e 's/[^A-Za-z0-9.()[]]/./g'
나에게 다음과 같은 출력을 제공합니다.
Some Movie Name! (2015) [1080p]
이것이 내가 원하는거야:
Some.Movie.Name.(2015).[1080p]
"]" "]"를 이스케이프하는 방법을 모르겠습니다. 작동하지 않습니다.
내가 얻을 수 있는 가장 가까운 것은 다음과 같습니다.
echo 'Some Movie Name! (2015) [1080p]' |sed -e 's/[^A-Za-z0-9.()[]/./g'
Some.Movie.Name..(2015).[1080p.
그런 다음 다시 sed로 파이프하여 이중 마침표를 제거할 수 있습니다.
|sed 's/\.\././g'
답변1
@Glenn Jackman의 기민한 관찰을 바탕으로 방법이 다음과 같이 변경되었습니다.
$ printf '%s\n' "$string" | tr -cs '[:alnum:].[]()\n' '[.*]'
-c
=> 입력 세트를 반전/보완합니다.-s
=>는 데이터에서 발견된 2의 보수 입력 세트의 연속 문자를 단일 점 문자로 압축합니다.
tr
멀티바이트 문자를 지원하는 구현은 거의 없습니다 sed
. 특히 GNU는 tr
이를 지원하지 않지만 GNU는 sed
지원합니다. 예를 들어 UTF-8 입력으로 영어가 아닌 문자를 처리하려면 다음으로 전환할 수 있습니다 sed
.
printf '%s\n' "$string" | sed 's/[^][[:alnum:]()]\{1,\}/./g'
는 ]
바로 뒤에 와야 합니다 ^
. 또한 예 를 들어 기반 솔루션 대신 에 변경 .
하기 위해 보충 세트에서 제거했습니다 .foo-.txt
foo.txt
foo..txt
tr
답변2
잘못 해석되는 것을 방지하려면 일치시키려는 종료 문장을 부정문 ]
바로 뒤에 배치하세요. 정규식 끝에 여러 문자를 마침표로 바꿀 ^
수 있습니다 (@Rakesh Sharma에게 감사드립니다).\+
$ echo 'Some Movie Name! (2015) [1080p]' | sed -e 's/[^][A-Za-z0-9()]\+/./g'
Some.Movie.Name.(2015).[1080p]
답변3
그리고 zsh
:
$ set -o extendedglob
$ string='Some Movie Name! (2015) [1080p]'
$ printf '%s\n' ${string//[^][()[:alnum:]]##/.}
Some.Movie.Name.(2015).[1080p]
ksh93
또는 사용 bash -O extglob
( shopt -s extglob
bash 없이 호출 후 시작 -O extglob
):
$ string='Some Movie Name! (2015) [1080p]'
$ printf '%s\n' "${string//+([^][()[:alnum:]])/.}"
Some.Movie.Name.(2015).[1080p]
zsh x##
또는 ksh는 하나 이상의 s와 일치하는 +(x)
확장 정규 표현식과 유사합니다 .x+
x
답변4
당신은 이것을 할 수 있습니다tr
:
x='Some Movie Name! (2015) [1080p]'
printf '%s\n' "$x" | tr -cd 'A-Za-z0-9.()[] ' | tr ' ' '.'
Some.Movie.Name.(2015).[1080p]