47

私は単純な入力を取るための最良の方法を探しています:

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

英数字以外の文字、小文字 (大文字) を削除し、スペースをアンダースコアに置き換えてクリーンアップします。

順序は重要ですか?trこれについて最善/唯一の方法はありますか?

4

6 に答える 6

50

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 に渡すのを待つことで、英数字とアンダースコアしかないことがわかり、スペースがないことを確認できるため、特殊文字がシェルによって解釈されることを心配する必要がありません。

于 2008-09-18T17:04:57.623 に答える
39

Bashはこれをすべて単独で実行できます。ありがとうございます。man ページのParameter Expansionのセクションを見ると、その bash に組み込みの置換、部分文字列、trim、rtrim などが含まれていることがわかります。

英数字以外の文字をすべて削除するには、次のようにします。

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

それがオッカムの剃刀です。別のプロセスを起動する必要はありません。

于 2008-09-18T04:18:28.277 に答える
1

perlで実行できます。

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

ここでは ksh スタイルのサブシェルを使用していますが、bash で機能するかどうかは完全にはわかりません。

これがシェルの良いところです。perl、awk、sed、grep などを使用できることです。

于 2008-09-18T03:36:45.083 に答える
1

クイック&ダーティ:

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

于 2008-09-18T03:06:00.197 に答える
0

少し調べてみると、tr実際に最も簡単な方法のようです。

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

オッカムの剃刀だと思います。

于 2008-09-18T03:01:50.333 に答える