문제

간단한 입력을 수행하는 가장 좋은 방법을 찾고 있습니다.

echo -n "Enter a string here: "
read -e STRING

영숫자가 아닌 문자, 소문자(대소문자)를 제거하고 공백을 밑줄로 바꿔서 정리합니다.

순서가 중요합니까?~이다 tr 이 문제를 해결하는 최선의/유일한 방법은 무엇입니까?

도움이 되었습니까?

해결책

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에 항목을 전달하기를 기다리면 영숫자와 밑줄만 있고 공백이 없는지 확인할 수 있으므로 셸에서 특수 문자를 해석하는 것에 대해 걱정할 필요가 없습니다.

다른 팁

Bash는 이 모든 것을 자체적으로 수행할 수 있습니다. 정말 감사합니다.매뉴얼 페이지 섹션을 보면 매개변수 확장, bash에 대체 항목, 하위 문자열, 트림, rtrim 등이 내장되어 있음을 알 수 있습니다.

영숫자가 아닌 모든 문자를 제거하려면 다음을 수행하십시오.

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

그건 오컴의 면도날.다른 프로세스를 시작할 필요가 없습니다.

빠르고 더러운:

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

Perl을 통해 실행할 수 있습니다.

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

여기서는 ksh 스타일 하위 쉘을 사용하고 있지만 bash에서 작동하는지 완전히 확신할 수 없습니다.

쉘의 좋은 점은 Perl, awk, sed, grep을 사용할 수 있다는 것입니다....

조금 둘러본 후에는 tr 실제로 가장 간단한 방법입니다.

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

오캄의 면도날, 아마도.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top