POSIXly:
pattern='\(.\).*
.'
grep -x -- "$pattern" file
Não funcionará se a linha começar ou terminar com caractere de byte inválido; se você quiser cobrir esse caso, poderá adicionar LC_ALL=C
, embora LC_ALL=C
trabalhe somente com dados de caractere de byte único.
perl6
parece ser a melhor ferramenta, se você tiver em sua caixa:
$ printf '\ue7\u301 blah \u107\u327\n121\n1\n123\n' |
perl6 -ne '.say if m/^(.).*$0$/ || /^.$/'
ḉ blah ḉ
121
1
Embora ainda engasgue com caracteres inválidos.
Observe que perl6
alterará seu texto, transformando-o em NFC
form:
$ 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
Internamente, perl6
armazena string em NFG
form (representa Normalization Form Grapheme
), que é perl6
inventado para lidar corretamente com graphemes não pré-compostos:
$ printf '\u0044\u0323\u0307\n' | perl6 -ne '.chars.say'
1
$ printf '\u0044\u0323\u0307\n' | perl6 -ne '.codes.say'
2