長さに基づいて線を選択

長さに基づいて線を選択

grepいくつかのパターンではなく、長さに基づいて線を見つけて印刷するのに適したツールを使用したいと思います。

2行のファイルがあるとしましょう。

  • 行1:長さ= 300文字
  • 行2:長さ= 120文字

ライン2のみを出力するコマンドを探しています。

ベストアンサー1

正確に120文字

そしてgrep

grep -xE '.{120}' < your-file
grep -x '.\{120\}' < your-file # more portable

そしてawk

awk 'length == 120' < your-file

0~120文字

そしてgrep

grep -xE '.{0,120}' < your-file
grep -x '.\{0,120\}' < your-file # more portable

そしてawk

awk 'length <= 120' < your-file

~のため厳密に言えば120未満、120を119<=またはに変更します<

120文字以上:

そしてgrep

grep -E '.{120}' < your-file # lines that contain a sequence of 120 characters
grep '.\{120\}' < your-file # more portable

他のオプションもあります:

grep -E '^.{120}' < your-file # lines that start with a sequence of 120 characters
grep '^.\{120\}' < your-file # more portable
grep -xE '.{120,}' < your-file # lines that have 120 or more characters
                               # between start and end.
grep -x '.\{120,\}' < your-file # more portable

そしてawk

awk 'length >= 120' < your-file

~のため厳しく120以上、120を121または>=に変更します>


これは、入力がロケールの文字マップに従って正しくエンコードされた有効なテキストであると仮定します。入力にNUL文字、有効な文字を形成しないバイト列、次のより大きい行LINE_MAX(バイト単位)、または無制限の最後の行(grep次の場合は不足している区切り文字が追加されている)が含まれている場合、マイルが減少する可能性があります。awk違い。

文字数ではなくバイト数でフィルタリングするには、ロケールをまたはCPOSIXLC_ALL=C grep...に設定します。

文字の代わりに子孫クラスターの数に基づいてフィルタリングしてオプションをサポートgrepしている場合は、上記と置き換えることが-Pできます。EP.\X

比較する:

$ locale charmap
UTF-8
$ echo $'e\u0301te\u0301' | grep -xP '\X{3}'
été
$ echo $'e\u0301te\u0301' | grep -xE '.{5}'
été
$ echo $'e\u0301te\u0301' | LC_ALL=C grep -xE '.{7}'
été

(つまり、été3つの子クラスター、5文字、7バイト)。

grep -Pすべての実装でサポートされているわけではありません\X。一部はUTF-8マルチバイト文字マッピングのみをサポートしています。

表示幅に基づくフィルタリングは別の問題です。与えられた文字列の表示幅は表示装置によって異なります。より文字列の表示幅を取得します。これについて詳しく学んでください。

おすすめ記事