첫 번째 문자가 마지막 문자와 동일한지 확인하시겠습니까?

첫 번째 문자가 마지막 문자와 동일한지 확인하시겠습니까?

이에 대한 아이디어가 있습니다. 역참조를 사용해야 grep하지만 이것이 제가 얻을 수 있는 가장 가까운 것입니다.

grep "^[a-zA-z]\$[a-zA-z]\

내 문제는 첫 번째 문자 ==를 마지막 문자로 확인하는 방법을 잘 모르겠다는 것입니다.

답변1

당신은해야합니다

grep -E '^([a-zA-Z]).*\1$'

첫 번째 문자를 캡처 (...)하고 역참조를 마지막 문자로 사용하고 그 사이의 다른 모든 문자는 건너뜁니다 .*. 이 -E스위치는확장 정규식일치하므로 명령 범위 내에서 캡처 그룹을 이스케이프할 필요가 없습니다 grep. 그러나 다음을 수행하여 이식성을 향상시킬 수도 있습니다.

grep '^\([a-zA-Z]\).*\1$'

단일 문자가 포함된 행만 출력하려는 ​​경우(그러나 이는 동일한 첫 번째 문자와 마지막 문자라고도 함) 선택적으로 해당 문자의 존재 여부를 정의할 수 있습니다.

grep -- '^\([a-zA-Z]\)\(.*\1\)\{0,1\}$'

\{0,1\}일치하지 않거나 한 번만 일치함무늬 .*\1이상.

아니면 이것을 각각 일치시키세요.하나의위와 같은 바이트 문자는 다음과 같습니다.

grep -- '^\(.\)\(.*\1\)\{0,1\}$'

(Basic-Regular-Expression, BRE) 패턴 일치는 기본적으로 grep사용됩니다 . 여기서 , , , 및 --basic-regexp같은 메타 문자는 특별한 의미를 잃고 문자 그대로 일치합니다. 변환 정의 유형 을 사용해야 합니다 . , 및 또는 그냥 전환하세요.?+{|()\?\+\{\|\(\)패턴 매칭ERE에 연결합니다 -E(그러나 POSIX ERE에는 역참조가 없습니다).


문자열 길이가 같은지 확인질소:

grep -- '^\([a-zA-Z]\{N-HERE\}\)\(.*\1\)\{0,1\}$'

그림문자 길이:

grep -- '^\([a-zA-Z]\{3\}\)\(.*\1\)\{0,1\}$'

위에서도 언급했듯이 다음과 같은 줄이 반환됩니다.(질소일반적으로) 문자 길이 xxx, 필요하지 않은 경우 다음으로 변경하세요.

grep -- '^\([a-zA-Z]\{3\}\).*\1$'

답변2

awk이는 텍스트 줄을 다루는 경우 가장 분명합니다.

awk 'length>1 && substr($0,1,1)==substr($0,length,1)' file

이것이 쉘 변수인 경우:

case $var in ''|?) echo no;; "${var#"${var%?}"}"*) echo yes;; *) echo no;; esac
[ "${#var}" -gt 1 ] && [ "${var%"${var#?}"}" = "${var#"${var%?}"}" ]

답변3

쉘이 테스트를 쉽게 수행할 수 있는데 왜 grep외부 유틸리티를 사용합니까?awk

문자열에 두 개 이상의 문자가 포함되어 있다고 가정합니다. 문자열에 문자가 하나만 포함되어 있으면 마지막 문자가 첫 번째 문자와 같다고 주장할 수 있지만 OP의 질문은 두 개 이상의 문자를 포함하는 문자열에 관한 것이라고 생각합니다.

#!/bin/bash

# set -x
# set -v

is_match() {
   (( ${#1} < 2 )) && return 1
   [[ "${1:0:1}" != "${1: -1}" ]] && return 1
   return 0
}

check() {
   if is_match "$1"
   then
      echo "\"$1\" is a match"
   else
      echo "\"$1\" is not a match"
   fi
}

check ""
check "a?"
check "a*"
check "a"
check "cdc"
check "abbba"
check "é"
check "étéa"
check "été"

산출:

"" is not a match
"a?" is not a match
"a*" is not a match
"a" is not a match
"cdc" is a match
"abbba" is a match
"é" is not a match
"étéa" is not a match
"été" is a match

답변4

현재 레코드를 빈 문자열로 분할하고 첫 번째 필드를 마지막 필드와 비교합니다.

$ echo "racecar" \
| gawk -F "" '$1 == $NF'
racecar
  • GNU awk이 아티팩트는 @Ed Morton이 지적한 대로만 작동합니다 .

관련 정보