sed コマンドについて: sed 's/\s\s*/ /g'

sed コマンドについて: sed 's/\s\s*/ /g'

私は次のコマンドを見つけました。

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スペースが狭くなる心配はありません)

おすすめ記事