1

$string という文字列があります

string='-d $DESTDIR/ERRORS/$BASEDIR ]] || $MKDIR -p     word1 word22   word3.5'

現在、これを sed で 2 回パイプ処理しています。一度特殊文字を引き出してから、スペース/タブを単一のスペースに変更します。

echo $string | sed 's/[^a-zA-Z0-9]/ /g' | sed 's/\s\s*/ /g'
output='d DESTDIR ERRORS BASEDIR MKDIR p word1 word22 word3 5'

これはうまくいきますが、効率を上げたいと思っています。これを単一の sed コマンドに統合するのを手伝ってくれる人はいますか?

EDITこれは、HP/SOL/LINのPOSIX互換である必要があることに注意してください

4

2 に答える 2

2

使用tr

echo $string | tr -Cs a-zA-Z0-9 ' '

trは、文字の翻訳、削除、および絞り込みを行うための非常に強力な(そして高速な)ツールです。

この特定のコマンドCは、最初のセット(a-zA-Z0-9)の実装からのすべての文字を2番目のセットからの文字に変換します。2番目のセットにはスペースのみが含まれているため、これにより、英数字以外のすべての文字(タブを含む)がスペースに変換されます。次にs、2番目の文字セットのすべての文字シーケンスを1つの文字に絞り込みます。これにより、一連のスペースが単一のスペースに置き換えられます。

例:

$ string='-d $DESTDIR/ERRORS/$BASEDIR ]] || $MKDIR -p     word1 word22   word3.5'
$ output=$(echo $string | tr -Cs 'a-zA-Z0-9' ' ')
$ echo $output
d DESTDIR ERRORS BASEDIR MKDIR p word1 word22 word3 5
于 2012-09-20T05:37:22.350 に答える
1

これを試して:

echo $string | sed -r 's/[^[:alnum:]]/ /g;s/ +/ /g'

達人。

于 2012-09-20T05:31:45.707 に答える