Bash 스크립트에서 사용자 입력을 어떻게 삭제합니까?
-
01-07-2019 - |
문제
간단한 입력을 수행하는 가장 좋은 방법을 찾고 있습니다.
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:]'`"
오캄의 면도날, 아마도.