파일이 있어요 -
cat regex30.txt
(914).582.3013
(873).334.2589
(521).589.3147
(625).235.3698
(895).568.2145
(745).256.3369
으로 변환하고 싶습니다.
914.582.3013
873.334.2589
521.589.3147
625.235.3698
895.568.2145
745.256.3369
내 단계는 다음과 같습니다.
sed -r 's/\(([0-9]<Space>{3})\)(\.[0-9]{3}\.[0-9]{4})/\1\2/g' regex30.txt
그런 다음 결과를 얻습니다.
(914).582.3013
(873).334.2589
(521).589.3147
(625).235.3698
(895).568.2145
(745).256.3369
왜 이런 결과가 나오나요? 공간이 있다는 것이 왜 중요한가?
공간을 제거하면 제대로 작동합니다.
sed -r 's/\(([0-9]{3})\)(\.[0-9]{3}\.[0-9]{4})/\1\2/g' regex30.txt
914.582.3013
873.334.2589
521.589.3147
625.235.3698
895.568.2145
745.256.3369
제가 이해한 바에 따르면 [0-9] {3}
-는 0부터 시작할 수도 있는 3자리 숫자를 나타냅니다.
[0-9]{3}
정규식과 의 차이점은 무엇입니까 [0-9] {3}
?
공간이 있다는 것이 왜 중요한가, 아니면 동시에 볼 수 없는 것인가.
공백을 표현하기 위해 '\s'를 사용했다고 생각했습니다.
답변1
면책 조항: 정규식을 구문 분석하지 않았습니다. 귀하의 질문에 대한 답변은 다음과 같습니다.
[0-9]{3}
정확히 소수점 이하 세 자리를 나타냅니다. [0-9] {3}
10진수 뒤에 공백 3개가 오는 것을 나타냅니다. 이는 {3}
(소위 "번들"이라고 함) 선행하는 소위 "원자"를 반복하기 때문입니다 .
정규식 매뉴얼 페이지에서:
$ man regex
... An atom followed by a bound containing one integer i and no comma
matches a sequence of exactly i matches of the atom. ...
"원자"라는 용어는 다음 단락에서 정의됩니다. 잘 읽었습니다.
답변2
공백을 무시할 수 있는 내가 아는 유일한 정규식은 perl 정규식 또는 호환 정규식 및 ast-open 정규식(perl 정규식에서 많은 연산자를 차용함)입니다. 기본적으로는 이 작업을 수행하지 않지만 x
이 플래그가 활성화된 경우에만 이 작업을 수행하십시오.
AFAIK, ssed
-R 옵션이 있는 PCRE만 지원됩니다.
따라서 다음이 필요합니다.
ssed -R 's/ \d {3}/.../gx'
ssed -R 's/(?x) \d {3}/.../g'
또는 (ast-open sed
활성화된 경우 sed
ksh93도 내장되어 있습니다):
ast-sed 's/\(?x\) \d \{3\}/.../g'
ast-sed -E 's/(?x) \d {3}/.../g'
ast-sed -A 's/(?x) \d {3}/.../g'
(기본, 확장, 고급의 세 가지 정규식 유형을 지원합니다).
이 플래그가 활성화되면 리터럴 공백 문자와 일치하도록 공백 앞에 공백을 붙여야 x
합니다 (또는 ASCII 기반 시스템에서 사용).[ ]
\
\x20