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
awk
A、W、K などによって元のレコードから派生した実装では動作しません。awk
BSDと商用への影響ユニス。携帯性に優れていますが、入力が簡単です。
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が鋭いアクセントマークと組み合わせられている場合は機能しません。)
grep
PCRE対応の-P
graphemクラスタを使用するには、次の手順に従ってください。
$ printf 'e\u0301te\u0301\n' | grep -xPe '(\X).*\1|\X'
été
両方のクラスタの分解が同じであると仮定する。たとえば、で示されるaは、ḉ
または()または()またはḉ()で示されるc
U+0301
U+0327
ものと一致しません。これを行うには、正規化された型を調べる必要があります。c
U+0327
U+0301
ć
U+0107
U+0327
ç
U+00E7
U+0301
U+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$