私は次のコマンドを見つけました。
ls -l <directory> \
| tail -n +2 \
| sed 's/\s\s*/ /g' \
| cut -d ' ' -f 3 \
| sort \
| uniq -c
\s\s*
このsed
オプションの目的はわかりません。
私はそれが\s
空白を意味することを知っています。 2番目のスペース\s
が前にあるため、*
2番目のスペースは0回以上一致します。
sed
これは、入力ストリーム内の1つ以上の連続するスペースを単一のスペースに置き換えることを意味しますか?それでは、\s+
代わりに使用するのはどうですか\s\s*
?
ベストアンサー1
\s
[[:space:]]
すべての種類の(水平または垂直)スペース文字(または他の編集コマンドでパターンスペースに挿入されている\s
場合は改行文字)に一致するPOSIX式を作成するためのGNU正規表現のショートカットです。sed
この\s
表記法はもともとPerl正規表現に由来していました。
以下のコードの一部は[[:space:]]
一般的に使用されていますが、実際に意味 [[:blank:]]
、スペースとタブのみが一致します。
注文する
sed 's/\s\s*/ /g'
1 つ以上の連続した空白を 1 つの空白に置き換え、現在の行に一致する項目がなくなるまで置換を繰り返します。
はい。代わりにそれを使用することもできますがs/\s+/ /g
、拡大する-E
(GNU)基本式の代わりに正規表現を使用するため、コマンドに以下を追加する必要があります。
sed -E 's/\s+/ /g'
次に、非標準オプションを使用してください(-E
)。そしてGNU固有の正規表現(\s
)。標準に準拠した方法でコマンドを作成するには、以下を使用する必要があります。
sed 's/[[:space:]][[:space:]]*/ /g'
または
sed 's/[[:space:]]\{1,\}/ /g'
意味は、\{1,\}
拡張正規表現修飾子および(「1つ以上」)と同じです。+
{1,}
また、使用することができます
tr -s '[:blank:]' '[ *]'
同様の作業を行います。つまり、すべてのスペースとタブをスペースに変換し、-s
連続するスペースに squeeze() を単一のスペースとして実行します。を使用すると、[:space:]
望ましくない改行(キャリッジリターン、垂直タブなどを含む)も置き換えられます。
または、そのパイプラインでsed
操作を実行し、tail
次のものを使用できます。
ls -l dir | sed '1d; s/[[:space:]]\{1,\}/ /g' | cut -d ' ' -f 3 | sort | uniq -c
または以下を使用してくださいawk
。
ls -l dir | awk 'NR > 1 { count[$3]++ } END { for (user in count) print user, count[user] }'
(使用するとawk
スペースが狭くなる心配はありません)