2008-09-18 11 views

답변

41

dj_segfault가 지적했듯이 쉘은 대부분 이것을 수행 할 수 있습니다. 당신이 문자열을 더 낮게 감추기 위해 외부에 뭔가를 쓰러 뜨려야 할 것처럼 보입니다. 이를 위해 위의 perl과 같은 많은 옵션이 있지만, tr은 아마도 가장 단순하다고 생각합니다.

# first, strip underscores 
CLEAN=${STRING//_/} 
# next, replace spaces with underscores 
CLEAN=${CLEAN// /_} 
# now, clean out anything that's not alphanumeric or an underscore 
CLEAN=${CLEAN//[^a-zA-Z0-9_]/} 
# finally, lowercase with TR 
CLEAN=`echo -n $CLEAN | tr A-Z a-z` 

여기의 순서는 다소 중요합니다. 우리는 밑줄을 없애고 공백을 밑줄로 바꾸기를 원하기 때문에 먼저 밑줄을 제거해야합니다. 끝까지 tr에 전달하기를 기다림으로써 우리는 영숫자와 밑줄 만 갖고 있다는 것을 알기 때문에 공백이 없다는 것을 확신 할 수 있으므로 쉘이 해석하는 특수 문자에 대해 걱정할 필요가 없습니다.

+1

독자주의 사항 :이 작업을 수행하는 데 문제가 있으면 shebang을 확인하여 bash 또는 sh를 호출하는지, 그리고 시스템이 'sh'를 해석하는 방법을 확인하십시오. –

+2

Bash 4에서는 사례 수정도 수행 할 수 있습니다. 'lowercase = $ {CLEAN ,,}'[Bash Hackers Wiki] (http : //wiki.bash-hackers.org/syntax/pe)는 맨 페이지보다 인간이 읽을 수있는 * 방식으로 매개 변수 확장을 설명합니다. – toxalot

+0

좋은 직장. 나는 이전에 이러한 쉘 기능을 인식하지 못했습니다. 감사! zsh를 사용하면 실제로이 모든 것을 중첩 할 수 있으므로 한 줄로 처리 할 수 ​​있습니다. 'echo -n $ {$ {str // _ /} ///_} // [^ a-zA-Z0-9 _] /} | tr A-Z a-z' .. 나는 스크립트에 이해할 수없는 것을 넣어 두지 않는 것이 좋습니다. :) (편집 : 형식) –

0

:

export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-' | tr '[:upper:]' '[:lower:]'`" 

Occam's razor, 나는 가정한다. 신속하고 더러운

+0

'STRING = $ (rm/tmp/*)'를 설정하면 정리하기 전에 $ STRING을 반향 시키면 하위 쉘을 실행하고/tmp/content를 제거하므로 ... 모든 에코가 수행되기 전에 위생 처리를 해주십시오. – higuita

1

:

STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`

+0

광산에서 작업 할 때 솔루션을 보지 못했습니다. – Axeman

1

당신이 펄을 통해 실행할 수 있습니다.

export CLEANSTRING=$(perl -e 'print join(q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING})') 

여기 ksh 스타일의 서브 쉘을 사용하고 있습니다. 나는 bash에서 잘 작동하는지 완전히 확신하지 못합니다. 쉘의 좋은 점을이다

, 당신은, AWK, 나오지도, 그렙 ....

29

배쉬 모두 그 자체에서이 작업을 수행 할 수 있습니다 펄을 사용하여 대단히 감사합니다 수 있다는 것입니다. 당신이 매개 변수 확장에 남자 페이지의 섹션을 보면, 그 떠들썩한 파티가 내장되어 있음을 대체 볼 수 있습니다, 문자열, 수행

모든 영숫자가 아닌 문자를 제거하기 위해 등, RTRIM, 트림

CLEANSTRING=${STRING//[^a-zA-Z0-9]/} 

오캄의 면도날 있다고. 다른 프로세스를 시작할 필요가 없습니다.

+0

글쎄, 좋은 대답. 나는 그것을 실현하지 않고 매개 변수 확장을 사용하고있었습니다. –

+2

사양의 하위 집합에 대한 좋은 대답이지만 공백을 밑줄로 변경하지는 않습니다. – Axeman