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

관련 정보