2012-03-24 4 views
1

4 및 5 다음에 오는 쉼표를 어떻게 대체합니까? 하나와 둘을 따르는 사람들은 그렇지 않습니까?정규식 - Sed

\"One,Two, Three\" Four, Five, Six 

sed s'/,/|/'g 

나는 탈출 따옴표뿐만 아니라이 예 내의 모든 쉼표에 적용 할 수있는 답변을 부탁드립니다.

또 다른 예는 다음과 같습니다

Mr ,Joe,Lish,,\"Acme, Inc.\",\"9599 Park Avenue, Suite 301\",Manhattan,NY,10022,\"\"\"6 A MAILING LIST MMBR GENERAL\"\"\" 
+2

아니다 당신은 그들에게 * 정규적이지 않다는 것을 이해하도록 요구하고 있습니다. – dmckee

+0

수정. 정규 표현식은 일반적으로 여기에 필요한 * state *를 가지고 있지 않습니다. 구문 분석기는 따옴표 안에 있는지 여부에 대한 상태 정보를 유지해야합니다. –

답변

0

정규 표현식 내다 및 lookbehind 사업자가 있습니다. 예를 들어, 자바 스크립트 호출

bodyText = bodyText.replace (/ Aa (? = A)/g, 'AaB');

"Aa"라는 텍스트가 "AaB"로 바뀌고 "Aa"가 뒤따라 "AaBA"가 표시됩니다. "Aa"다음에 "A"가 없으므로 "AaB"와 일치하지 않습니다. 이것은 미리보기 호출입니다.

나는 lookbehind 구문이 무엇이라고 생각합니까? < =.

따라서 사용중인 패키지에서이 연산자를 지원하는 경우이 연산자를 사용하여 "4"또는 "5"로 시작하는 ","과 일치시키고 ","만 대치 할 수 있습니다.

+0

* I * 사용에 어떤 sed도 없습니다. – dmckee

+0

@dmckee'alias sed = "perl -p"'이면 잘 작동합니다. :) – tchrist

+0

@tchrist : 당신은 아픈 사람입니다. 그러나 영리하다. 그리고 나는 그것을 * 좋은 길로 의미합니다. – dmckee

0

나는이 하나를 내놓았다 : 선을 가정

echo '\"One,Two, Three\" Four, Five, Six' | sed 's/\(\("[^"]*"\)\?[^",]\+\),/\1 |/g' 

[ ["someting"] word, ]* ["someting"] word 
+0

그건 나를 위해 작동하지 않습니다. 그게 아무것도 바뀌면 나는 터미널을 사용하는 Mac에있다. – adayzdone

1

한 가지 방법은 sed를 사용 같다 :

내용 script.sed의 :

## Substitute '\"' with '\n'. 
s/\\\"/\n/g 

## If there is an odd number of '\"' or the string doesn't end with '\"' I 
## will append some at the end. There is no danger, but it will be used to 
## avoid an infinite loop. 
## 1.- Save content to 'hold space'. 
## 2.- Remove all characters except '\n'. 
## 3.- Remove one of them because next command will add another one. 
## 4.- Put content in 'pattern space' to begin working with it. 
## So, if in original string there were 3 '\"', now there will be 6. ¡Fine! 
h 
s/[^\n]//g 
s/\n// 
H 
g 

## Label 'a'. 
:a 

## Save content to 'hold space'. 
h 

## Remove from first '\n' until end of line. 
s/\(\n\).*$/\1/ 

## Substitute all commas with pipes. 
s/,/|/g 

## Delete first newline. 
s/\n// 

## Append content to print as final output to 'hold space'. 
H 

## Recover rest of line from 'hold space'. 
g 

## Remove content modified just before. 
s/[^\n]*// 

## Save content to 'hold space'. 
h 

## Get first content between '\n'. 
s/\(\n[^\n]*\n\).*$/\1/ 
s/\n\{2,\}// 

## Susbtitute '\n' with original '\"'. 
s/\n/\\"/g 

## Append content to print as final output to 'hold space'. 
H 

## Recover rest of line from 'hold space'. 
g 

## Remove content printed just before. 
s/\n[^\n]*\n// 

/^\n/ { 
    s/\n//g 
    p 
    b 
} 

ba 
의3210

내용 :

\"One,Two, Three\" Four, Five, Six 
One \"Two\", Three, Four, Five 
One \"Two, Three, Four, Five\" 
One \"Two\" Three, Four \"Five, Six\" 

실행이 좋아 :

sed -nf script.sed infile 

다음과 같은 결과로 :

\"One,Two, Three\" Four| Five| Six 
One \"Two\"| Three| Four| Five 
One \"Two, Three, Four, Five\" 
One \"Two\" Three| Four \"Five, Six\" 
+0

응답 : undefined label 'a' – adayzdone

+0

@adayzdone : 죄송합니다. 문제를 재현 할 수 없습니다. 내 버전은 ** GNU sed versión 4.2.1 **입니다. 당신 것입니다. – Birei

+0

Mac 10.6.8과 함께 제공되는 버전 – adayzdone

1

이 당신을 위해 작동 될 수 있습니다

sed 's/^/\n/;:a;s/\n\("[^"]*"\|[^,]\)/\1\n/;ta;s/\n,/|\n/;ta;s/.$//' file 

Expla 국가 :

  • 패턴 공간에 개행을 추가하십시오.
  • s/^/\n/는 라벨을 :a
  • 이동 따옴표 사이의 문자열 또는 쉼표가 아닌 문자 중 하나 이상 줄 바꿈을합니다. s/\n\("[^"]*"\|[^,]\)/\1\n/
  • 대체가 레이블링에 성공한 루프 인 경우. ta
  • |\n\n,으로 대체하십시오.s/\n,/|\n/
  • 대체가 레이블링에 성공한 루프 인 경우. ta
  • 대체 작업이 수행되지 않으면 모두 완료되므로 개행을 삭제하십시오. s/.$// 편집

: 사실 문자의 고유 문자 또는 조합 \n 대신 사용할 수 있습니다

: 이런 종류의 언어 때문에 정규 표현식 작업 일반적으로

echo 'Mr ,Joe,Lish,,\"Acme, Inc.\",\"9599 Park Avenue, Suite 301\",Manhattan,NY,10022,\"\"\"6 A MAILING LIST MMBR GENERAL\"\"\"' | 
sed 's/^/@@@/;:a;s/@@@\("[^"]*"\|[^,]\)/\[email protected]@@/;ta;s/@@@,/|@@@/;ta;s/@@@$//' 
Mr |Joe|Lish||\"Acme, Inc.\"|\"9599 Park Avenue, Suite 301\"|Manhattan|NY|10022|\"\"\"6 A MAILING LIST MMBR GENERAL\"\"\" 
+0

무엇이 잘못 되었나요? http://i.imgur.com/NdNZ3.png – adayzdone

+0

sed의 버전이'\ n' 형식의 줄 바꿈을 허용하지 않는 것 같습니다. bash를 쉘로 사용하거나 CTRL-v return을 입력하여 실제 줄 바꾸기를 삽입하려면'\ n '' '' '으로 모든 \ n을 바꾸십시오. 또한 [여기] (http://sed.sourceforge.net/sedfaq4.html#s4.1) – potong

+0

참조 다른 편집보기 – potong