이에 대한 아이디어가 있습니다. 역참조를 사용해야 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이 지적한 대로만 작동합니다 .