grep コマンドは、同じ文字で始まり、終わるすべての行を表示します。

grep コマンドは、同じ文字で始まり、終わるすべての行を表示します。

grep同じ文字で始まり、終わるすべての行を表示する方法を知りたいです。

答え1

POSIX的に:

pattern='\(.\).*\1
.'
grep -x -- "$pattern" file

行が無効なバイト文字で始まったり終わったりすると、動作しません。これを上書きするには、を追加できますLC_ALL=C。ただし、LC_ALL=Cこれはシングルバイト文字データに対してのみ機能します。


perl6箱に入っていれば最高の道具のようです。

$ printf '\ue7\u301 blah \u107\u327\n121\n1\n123\n' |
  perl6 -ne '.say if m/^(.).*$0$/ || /^.$/'
ḉ blah ḉ
121
1

無効な文字のためにまだ窒息しますが。


perl6テキストを次のように変換して変更しますNFC

$ printf '\u0044\u0323\u0307\n' |
  perl6 -pe ''                  |
  perl -CI -ne 'printf "U+%04x\n", ord for split //'
U+1e0c
U+0307
U+000a

$ printf '\u0044\u0323\u0307\n' |
  perl -pe ''                   |
  perl -CI -ne 'printf "U+%04x\n", ord for split //'
U+0044
U+0323
U+0307
U+000a

内部的には、perl6文字列NFG(representatives)は、事前設定されていない文字を正しく処理するために設計された方法であるNormalization Form Grapheme形式で格納されます。perl6

$ printf '\u0044\u0323\u0307\n' | perl6 -ne '.chars.say'
1
$ printf '\u0044\u0323\u0307\n' | perl6 -ne '.codes.say'
2

答え2

grepではなくawk:

awk -F "" 'NF && $1 == $NF'

これらの特別な状況処理:

  • 空白行を印刷しない
  • 常に1つの文字行を印刷します。

空の FS はレコードを 、 、gawkのフィールドごとに 1 つの文字 (文字ではないバイト) に分割しますmawkが標準ではなく、busybox awkA、W、K などによって元のレコードから派生した実装では動作しません。awkBSDと商用への影響ユニス。携帯性に優れていますが、入力が簡単です。

awk '/./ && substr($0,1,1) == substr($0,length)'

答え3

grep -xe '\(.\).*\1' -e .

例:

$ printf '%s\n' il y était cet été  | grep -xe '\(.\).*\1' -e .
y
été

-xある精密一致(全行一致)。\1でキャプチャしたキャラクターの逆参照です\(.\)-e .単一文字を含む特別なケースの行を処理するためにaを追加します。

入力に現在のロケールの有効なテキストが含まれているとします。

ゲームが進行中です。特徴、いいえバイト(たとえば、UTF-8のéは2バイト0xc3 0xa9です。)文字素クラスタe(たとえば、éが壊れた形式で書かれ、U + 0301が鋭いアクセントマークと組み合わせられている場合は機能しません。)

grepPCRE対応の-Pgraphemクラスタを使用するには、次の手順に従ってください。

$ printf 'e\u0301te\u0301\n' | grep -xPe '(\X).*\1|\X'
été

両方のクラスタの分解が同じであると仮定する。たとえば、で示されるaは、または()または()またはḉ()で示されるc U+0301 U+0327ものと一致しません。これを行うには、正規化された型を調べる必要があります。c U+0327 U+0301ćU+0107U+0327çU+00E7U+0301U+1E09

$ printf '\ue7\u301 blah \u107\u327\n' |
  perl -MUnicode::Normalize -C -ne '
    print if /^\X$/ || NFC($_) =~ /^(\X).*\1$/'
ḉ blah ḉ

答え4

高速python2代替:

python -c 'import sys;[sys.stdout.write(l) for l in sys.stdin if len(l)>1 and l.rstrip("\n").endswith(l[0])]' < input.txt

例:

$ python -c 'import sys;[sys.stdout.write(l) for l in sys.stdin if len(l)>1 and l.rstrip("\n").endswith(l[0])]' < input.txt  | cat -A 
nathan$
 ookie $
a line a$

関連情報