0

次の出力から@文字の数を取得するにはどうすればよいですか。trコマンドを使用して抽出しましたか?私はそれを行うための最良の方法を知りたいのですが?私は同じことをする他の方法を意味します。

{running_device,[test@01,test@02]},

私の解決策は次のとおりです。

echo '{running_device,[test@01,test@02]},' | tr ',' '\n' | grep '@' | wc -l
4

3 に答える 3

2

使用する方が簡単だと思います。

echo '{running_device,[test@01,test@02]},' | tr -cd @ | wc -c

これで2が得られます(Mac OS X 10.7.5でテスト済み)。(指定された文字のセットの)「補完」を意味し、「削除」-cを意味するオプション。これにより、すべての非文字が削除され、提供されたものがカウントされます(改行がないため、行数は0ですが、文字数は2です)。 )。tr-d@wc

于 2013-01-17T04:09:50.430 に答える
1

あなたのアプローチに問題はありません。他のいくつかのアプローチは次のとおりです。

echo $(echo {running_device,[test@01,test@02]}, |awk -F"@" '{print NF - 1}')

また

echo $((`echo {running_device,[test@01,test@02]} | sed 's+[^@]++g' | wc -c` - 1 ))

私が抱える唯一の懸念は、このコマンドをループで実行している場合です(たとえば、大きなファイルの行ごとに1回)。その場合、シェルユーティリティをつなぎ合わせると、プロセスを起動するオーバーヘッドが発生し、処理が遅くなる可能性があるため、実行時間が問題になる可能性があります。この場合、ファイル全体を処理するために純粋なawkバージョンを作成することをお勧めします。

于 2013-01-17T04:05:25.140 に答える
1

GNUGrepを使用して文字の翻訳を回避する

これを行う別の方法は、私が個人的に直感的だと思っています。grepを使用して一致する文字だけを抽出し、grepの出力行をカウントします。例えば:

echo '{running_device,[test@01,test@02]},'   |
     fgrep --fixed-strings --only-matching @ |
     wc -l

結果としてが得2られます。

于 2013-01-17T08:28:46.947 に答える