정규식 라인에서 첫 번째 항목 만 일치


42

나는 정규식에 완전히 익숙하지 않으며 도움을 주시면 감사하겠습니다.

작업은 간단합니다. 다음과 같은 레코드가 포함 된 CSV 파일이 있습니다.

12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890

첫 번째 쉼표를 공백으로 바꾸고 나머지 모든 쉼표를 그대로 유지하고 싶습니다. 첫 번째 쉼표와 만 일치하는 정규 표현식이 있습니까?

나는 이것을 시도했다 : ^.....,. 이것은 쉼표와 일치하지만 쉼표 앞에 오는 문자열의 전체 길이와도 일치하므로 공백 으로 바꾸려고하면 모든 숫자도 삭제됩니다.


어떤 도구를 사용하고 있습니까? (sed, perl, awk, 다른 것?)
Mat

답변:


53

일치하는 패턴은 다음과 같습니다.

^([^,]+),

그 의미는

^        starts with
[^,]     anything but a comma
+        repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+)  remember that part
,        followed by a comma

예를 들어 perl에서 전체 일치 및 교체는 다음과 같습니다.

s/^([^,]+),/\1 /

교체 부분은 일치하는 모든 것을 가져 와서 기억 한 첫 번째 블록으로 대체하고 공백을 추가합니다. 코마는 첫 번째 캡처 그룹에 없기 때문에 "삭제"됩니다.


대박! 당신에게 매트 감사합니다, 그것은 잘 작동했습니다. 실제로 Textpad에서 작동하지 않았으므로 (정규 표현식이 제한적이라고 생각합니다.) PowerGrep 다운로드를 끝내고 검색을 사용하여 제공 한 표현으로 바꾸면 훌륭하게 작동했습니다. 좋은 설명에 감사드립니다. 진행 상황을 이해하는 데 도움이됩니다.
cows_eat_hay

7
s/,/ /

g옵션 은 기본적으로 ( 옵션 없이 ) 첫 번째 일치 항목 만 대체합니다.


1
이것이 실제로 텍스트 패드 검색 및 대체 구문입니까?
Daniel Beck

1
이것은의 구문 sed, perl그리고 몇몇 다른 도구를 제공합니다.
pabouk

3

첫 번째 숫자와 쉼표 만 일치해야합니다 ^(\d{5}),. 줄의 다른 모든 것을 고치려면 정규 표현식을 다음과 같이 변경하십시오.^(\d{5}),(.*)$


이것은 또한 트릭을했다. 나는 실제로 Mat의 솔루션을 사용했지만 결국 당신도 테스트했고 작동합니다. 도와 주셔서 감사합니다!
cows_eat_hay

\d{5}&하지 [^,]*? @가 더 일반적 일 것입니다.
JustinCB

2

더 우아한 솔루션은 지연 일치를 사용하는 것입니다.

s/^(.+?),/\1 /

첫 번째 쉼표 기호를 찾을 때까지 각 단계 에서 문자열 시작 ( ^)에서 끝 향해 문자 ( .+?) 씩 이동하여 문자를 그룹화합니다 . 첫 번째 쉼표와 함께이 그룹은 모두 그룹 ( \1) 및 공백 문자 로 바뀝니다 .


이것은 쉼표를 포함하지 않는 줄 (줄의 단일 값)과 일치하지 않습니다. 어떤 매칭 * 있습니다 보다 나은 하나가 될 수 +있으므로s/^(.*?),/\1 /
제프 퍼켓

또한 s/^([^,]*),/\1 /시작, 쉼표가 아닌 모든 항목, 쉼표와 일치하는 작업을 수행 할 수 있습니다 . 또한 s//일치하지 않는 것을 변경 하지 않는 것을 알고 있습니까?
JustinCB

1

TextPad는 항상 posix 표기법을 사용할 수 있지만 다른 대화 상자에서 설정을 변경해야합니다. 정규식에 TextPad의 기본 설정을 사용하려면 여는 괄호와 닫는 괄호를 "이스케이프"해야합니다.

각 줄의 시작 부분에서 5 자리 우편 번호 뒤에 공백을 바꿉니다.

^\([0-9]+\)[ ]

탭으로

\1\t

위와 같이 ^는 줄의 시작을 의미합니다.

\ (는 "이스케이프 처리 된 괄호"이며 첫 번째 검색 표현식의 시작, 즉 5 자리를 표시합니다.

[0-9] +는 하나 이상의 숫자 (5 자리 우편 번호가 아님)를 의미합니다.

\)는 첫 번째 검색 표현식의 끝을 나타내는 또 다른 "탈출 괄호"입니다.

[]는 공백 문자 일뿐입니다 (대괄호는 생략 할 수 있지만이 웹 페이지에서 아무도 볼 수는 없습니다 :-)

대체 표현에서

\ 1은 첫 번째 검색 표현식이며 위의 괄호 사이에있는 부분입니다 (하나 이상의 숫자)

\ t는 탭 문자입니다

따라서 찾기 및 바꾸기 명령은 하나 이상의 숫자를 찾은 다음 공백을 찾습니다. 그런 다음 모든 숫자를 동일한 자릿수 그룹과 탭으로 바꿉니다.

나는 단순히 "5 자리 뒤에 오는 공백"을 찾는 방법이 없다고 생각하므로 숫자를 건드리지 않고 공백을 바꿀 수 있습니다. 당신은해야 찾을 수 공간 (두 번째 문자열) 다음에 5 자리 (첫 번째 문자열). 그런 다음 중복되거나 성가신 것처럼 보이지만 ITSELF로 5 자리의 원래 문자열을 교체 한 다음 탭 (두 번째 문자열)을 교체하십시오.

이것을 아는 사람은 초보자가 이것에 대해 전혀 모른다는 것을 잊어 버립니다. 그래서 내 친구여, 내가 당신을 위해 철자를 쓰는 이유입니다.

Ed Poor Math Tutor 및 은퇴 한 컴퓨터 프로그래머 뉴욕시


0

정규식의 첫 번째 항목 만 일치 시키려면 모든 플래그를 제거하십시오. 각 정규 표현식에는 다음과 같은 플래그가 제공되며 일반적으로 전역 플래그를 사용하는 것이 기본적으로 두 번 이상 발생합니다.

  • / g =이 플래그를 사용하면 검색하지 않고 모든 일치 항목을 찾습니다. 첫 번째 일치 항목 만 반환됩니다.
  • / i = 대소 문자 구분
  • / m = 멀티 라인 모드
  • / s = 모두. 개행 문자와 일치시키기 위해 \ n
  • / u = 유니 코드
  • / y = 고정 모드 (특정 위치에서 검색)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.