与えられた範囲で行の長さを「grep」する方法は?

与えられた範囲で行の長さを「grep」する方法は?

メモ:この質問はこのQ&Aに関する補足資料です。指定された範囲内で*なし*行の長さを見つけるために「grep」する方法は?


長さの範囲が少なくとも3文字以上10文字以下のテキストファイル(改行で区切られた単語のリスト)から行を取得する必要があります。

例:

入力する:

egyezményét
megkíván
ki
alma
kevesen
meghatározó

出力:

megkíván
alma
kevesen

質問:どうすればいいですかbash

答え1

grep -x '.\{3,10\}'

どこ

  • -x--line-regexpGNUでも動作grep)全行にパターンマッチング
  • .任意の単一文字
  • \{3,10\}前の記号(ある場合)の3〜10倍を量子化します。

答え2

使用grep -E:

grep -E '^.{3,10}$'

これは3〜10文字の行に一致します。

答え3

以下を使用しますawk(GNUなどのロケール認識実装であると仮定すると、awk3文字より短いマルチバイト文字(「Ők」など)の行は一致しません)。

LC_ALL=hu_HU.UTF-8 awk 'length >= 3 && length <= 10' file

デフォルトでは、このlengthステートメントは(現在のレコード/行)の長さを返します。$0これは、コード内の行の長さが指定された範囲内にあるかどうかをテストするために使用されます。そのテストに対応する作業ブロックがない場合、基本的な作業は履歴を印刷することです。

与えられたデータのテスト:

$ LC_ALL=hu_HU.UTF-8 awk 'length >= 3 && length <= 10' file
megkíván
alma
kevesen

Perlに似ています:

$ LC_ALL=hu_HU.UTF-8 perl -C -lne '$l=length($_); print if ($l >= 3 && $l <= 10)' file
megkíván
alma
kevesen

答え4

私はこれが誰かに役立つと思います。展開して1行の特定の文字列と一致させたい場合次より長くない255文字を仮定しましょう。これが解決策になります。

使用法:文字列を探しているが作成していない、または不要な縮小JSファイルなどの長い行を除外する場合

grep -x '.\{1,255\}theStringIWant.\{1,255\}'

特定の数(1と255、255と1、または255と255のいずれか)を超えないように両端の長さを実際に制御できないため、少しハッキングされますが、ほとんどの場合、長い行が縮小するのを防ぎます。

BASH初心者のためのヒント\バックスラッシュは中括弧のエスケープ文字です{}

はい/証明:

echo "aaaalocalStoragebbbbccccdd" | grep -x '.\{3,10\}localStorage.\{3,10\}' #works
echo "aaaalocalStoragebbbbccccdddd" | grep -x '.\{3,10\}localStorage.\{3,10\}' #doesn't work, dddd puts end string to 12 chars

関連情報