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
違い。
文字数ではなくバイト数でフィルタリングするには、ロケールをまたはC
(POSIX
)LC_ALL=C grep...
に設定します。
文字の代わりに子孫クラスターの数に基づいてフィルタリングしてオプションをサポートgrep
している場合は、上記と置き換えることが-P
できます。E
P
.
\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マルチバイト文字マッピングのみをサポートしています。
表示幅に基づくフィルタリングは別の問題です。与えられた文字列の表示幅は表示装置によって異なります。より文字列の表示幅を取得します。これについて詳しく学んでください。