回答:
POSIXly:
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
形式(の略Normalization Form Grapheme
)で格納します。これは、perl6
事前に構成されていない書記素を適切に処理するために発明された方法です。
$ printf '\u0044\u0323\u0307\n' | perl6 -ne '.chars.say'
1
$ printf '\u0044\u0323\u0307\n' | perl6 -ne '.codes.say'
2
perl6
ただし、テキストが変更されることに注意してください(NFC(正規化フォーム「構成済み」)に変更)。
perl6
はNFG
(G
for Grapheme
)の形式で格納されることに注意してください。これは、perl6
事前に構成されていない書記素を適切に処理する方法です。
grepではなくawk:
awk -F "" 'NF && $1 == $NF'
これらの特別なケースが処理されます:
空のFSは、フィールドごとに一つの文字にレコードを分割しgawk
、mawk
そしてbusybox
awk
(バイトではなく、後者の二つのための文字)が、の実装では動作しない標準的ではないとしawk
、A、WおよびK等により元の1つに由来しますBSDおよび商用Unices。移植性は高くなりますが、入力する必要があります:
awk '/./ && substr($0,1,1) == substr($0,length)'
FS
空の文字列は標準ではなく、一部のawk
実装では機能しないことに注意してください。
awk 'length&&substr($0,1,1)==substr($0,length)'
(length
$0
{print $0}
nawk
はほとんど同じように機能します:-)
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が付いている場合)ではありませんたとえば、アキュートアクセントを組み合わせます)。
PCRE grep
をサポートするを使用して書記素クラスターで作業するに-P
は:
$ printf 'e\u0301te\u0301\n' | grep -xPe '(\X).*\1|\X'
été
これは、2つのクラスターの分解が同じであることを前提としています。たとえば、ḉ
はまたは()または()またはḉ()として表現されたもの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 ḉ
perl6
、perl6 -ne '.say if m/^(.).*$0$/ || /^.$/'
すべての作業を行う必要があります。
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$