テキストのスペースを計算する方法は?

テキストのスペースを計算する方法は?

次の例では、inetの前に4つのスペースがあります。

wolf@linux:~$ ip address show eth0 | grep 'inet '
    inet 10.10.10.10/24 brd 10.10.10.255 scope global dynamic eth0
wolf@linux:~$ 

この例のように、スペースの数をどのように計算できますか?

例はスペースが4つだけなので簡単です。

何かがあればどうでしょうか?何百、何千?

見つけることができるショートカットがありますか?

答え1

tr使用したい文字以外のすべての項目を削除できますwc

ip address show eth0 | grep 'inet ' | tr -d -c ' ' | wc -m

これは大量のテキストに合わせて拡張され、tr非常に効率的です。

ただし、trGNUを含む一部の実装では、trシングルバイト文字(スペース文字など)のみを使用できます。

先行スペースのみを計算するには、以下より強力なものが必要ですtr

ip address show eth0 | grep 'inet ' | sed 's/[^ ].*$//' | tr -d '\n' | wc -m

これにより、先行スペースを含まない各行のすべての部分が削除され、改行文字と数が削除されます。

バラより各行の特定の文字数を計算する方法は?1行あたりの数に興味がある場合

答え2

各行の先頭の空白文字数を数えるには、次のようにします。

awk -F '[^ ].*' '{print length($1)}'

スペース以外の文字で始まる一連の文字でフィールドを区切る最初のフィールドの長さ(文字)を印刷します。

入力行の先頭に見つかった最大スペース量(最大インデント)を報告するには、GNUを使用しますwc

sed 's/[^[:blank:]].*//' | wc -L

報告されたスペースの量は次のとおりです。ディスプレイ幅8列タップ停止を備えた表示装置で:

$ printf '\tfoo\n' | sed 's/[^[:blank:]].*//' | wc -L
8
$ printf '\u3000foo\n' | sed 's/[^[:blank:]].*//' | wc -L
2

U + 3000文字(私のロケールでは空白として分類された表の文字空白文字)は、UTF-8でエンコードされた3バイトの二重幅文字です。

文字として報告される最大長が必要な場合:

sed 's/[^[:blank:]].*//;s/./x/g' | wc -L

s/./x/g各行の各文字をx表示幅が1の文字に変換します。)

またはバイト単位:

sed 's/[^[:blank:]].*//' |
  LC_ALL=C tr -c '\n' '[x*]' | # convert each byte other than newline to x
  wc -L

答え3

  • 先行スペースの数を印刷します。

    awk '{print match($0,/[^ ]|$/)-1}' file
    

    match($0,/[^ ]|$/)空白ではなく、最初の([^ ])または行末($)と一致し、その位置を返します。

  • スペースの数を印刷します。

    awk -F '[ ]' '{print (NF?NF-1:0)}' file
    

    -F '[ ]'フィールド区切り文字をスペースに設定します。NFフィールドの数。三項式は、「NFが0でない場合はNF-1を印刷し、そうでなければ0を印刷する」を意味する。行が空の場合、NFは0になるからです。

答え4

私は次の例を挙げました。

`echo "      praveen"| grep -o "^ *"| awk '{print length($0)}'`6

output

6

Python

>>> a="      praveen"
>>> import re
>>> k=re.compile(r'^ *')
>>> m=re.search(k,a)
>>> print len(m.group())
6
>>> 

関連情報