정규식 제안

정규식 제안
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.greppattern~에한줄씩 입력하세요. 맞추고 싶다면전반적으로, 당신은 -x(에 대한정밀한^) 또는 및 regexp 연산자를 사용하여 시작과 끝에 패턴을 고정합니다 $. 1부터 34까지의 시퀀스를 포함하는 행에는 1도 포함되고 , 1의 시퀀스를 포함하는 행에는 정규식과 일치하기 때문에 grep -E 'x{1,34}'동일합니다 .grep xxxxxx{1,34}
  • 이 작업을 수행한다고 가정하면 예를 들어 일부는 빈 문자열로 바뀌고 다른 일부는 개행 문자로 바뀌기 echo "$var" | grep the-pattern때문에 신뢰할 수 없다는 점에 유의하세요 . 또한 전체 입력이 아닌 입력의 각 줄이 일치하므로 줄 바꿈이 포함된 경우 검사가 유효하지 않을 수 있습니다. 대신 ksh93, zsh 또는 bash 연산자를 사용하는 것이 좋습니다 .echo-neen\ngrep$varexpr[[ $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하거나 전달해 보세요 .-Egrep

echo "223255/12345678                    " | egrep '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'

또는

echo "223255/12345678                    " | grep -E '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'

답변3

어쩌면 이스케이프 /문자가... 소용이 있을까요 (\)? 그러나 작은 따옴표 안에 있기 때문에 그 안에 넣은 모든 것을 이스케이프 처리할 필요는 없는 것 같습니다.

내 디버깅 제안은 일부 문자를 제거하고 패턴에 어떤 문제가 있는지 확인하는 것입니다.

관련 정보