次の例では、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
非常に効率的です。
ただし、tr
GNUを含む一部の実装では、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
>>>