echo "223255/12345678 " | grep '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'
정규식에 따라 순서에 관계 0-9 a-z A-Z / - ? : ( ) . , " +
없이 최대 34자를 포함할 수 있습니다. 내가 맞나요?
이 경우 에코 값을 인쇄하지 않는 이유는 무엇입니까?
답변1
코드에 몇 가지 문제가 있습니다.
- 내부적으로
[...]
유일한 특수 문자는-
and]
([:
문자 클래스도 도입되었지만)이며 이를 이스케이프하는 방법은 with 가 아니라 for\
목록 의 첫 번째 또는 마지막 문자로 만들고 for 를-
첫 번째 또는 목록의 마지막 문자([-...]
또는[...-]
)]
첫 번째 문자([]...]
)입니다. 위의 내용은\-\
범위 내의 모든 문자를 의미합니다. 즉, 포함하지만 포함하지 않습니다. 그래서 당신이 필요합니다.\
\
\
-
[-0-9a-zA-Z/?:().,"+]
a-z
범위는 로캘A-Z
에 따라 다르며(é, ŝ... 등이 포함될 수 있음) 멀티바이트 문자도 포함될 수 있습니다. 이 범위에서 ASCII 문자만 원하는 경우 로케일을 C로 수정해야 합니다.... | LC_ALL=C grep ...
{x,y}
확장된 정규식 연산자입니다( 에서 지원됨grep -E
). 해당 기본 정규식( 에서 지원grep
) 연산자는 입니다\{x,y\}
. 그래서LC_ALL=C grep '[-0-9a-zA-Z/?:().,"+]\{1,34\}'
- 에서 어디든 일치하는지 확인하세요
grep pattern
.grep
pattern
~에한줄씩 입력하세요. 맞추고 싶다면전반적으로, 당신은-x
(에 대한정밀한^
) 또는 및 regexp 연산자를 사용하여 시작과 끝에 패턴을 고정합니다$
. 1부터 34까지의 시퀀스를 포함하는 행에는 1도 포함되고 , 1의 시퀀스를 포함하는 행에는 정규식과 일치하기 때문에grep -E 'x{1,34}'
동일합니다 .grep x
x
x
x
x
x{1,34}
- 이 작업을 수행한다고 가정하면 예를 들어 일부는 빈 문자열로 바뀌고 다른 일부는 개행 문자로 바뀌기
echo "$var" | grep the-pattern
때문에 신뢰할 수 없다는 점에 유의하세요 . 또한 전체 입력이 아닌 입력의 각 줄이 일치하므로 줄 바꿈이 포함된 경우 검사가 유효하지 않을 수 있습니다. 대신 ksh93, zsh 또는 bash 연산자를 사용하는 것이 좋습니다 .echo
-neen
\n
grep
$var
expr
[[ $var =~ pattern ]]
$var
요약하자면, 1~34개의 ASCII 문자로 구성되어 있는지 확인하려면 다음과 같이 작성해야 합니다.
if LC_ALL=C expr "x$var" : 'x[-0-9a-zA-Z/?:().,"+]\{1,34\}$' > /dev/null; then
echo yes
else
echo no
fi
( 정규 표현식 연산자 expr
가 있는 것처럼 암시적으로 패턴을 시작 부분에 고정합니다 .)^
답변2
다음 위치에 플래그를 사용 egrep
하거나 전달해 보세요 .-E
grep
echo "223255/12345678 " | egrep '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'
또는
echo "223255/12345678 " | grep -E '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'
답변3
어쩌면 이스케이프 /
문자가... 소용이 있을까요 (\)
? 그러나 작은 따옴표 안에 있기 때문에 그 안에 넣은 모든 것을 이스케이프 처리할 필요는 없는 것 같습니다.
내 디버깅 제안은 일부 문자를 제거하고 패턴에 어떤 문제가 있는지 확인하는 것입니다.