sed를 사용하여 공백을 마침표로 바꾸고 ()와 []를 유지하는 방법

sed를 사용하여 공백을 마침표로 바꾸고 ()와 []를 유지하는 방법

특수문자를 모두 제거하고 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-.txtfoo.txtfoo..txttr

답변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 extglobbash 없이 호출 후 시작 -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]

관련 정보