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
및 의 필드당 하나의 문자(문자가 아닌 바이트)로 분할 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$