2016-08-10 5 views
1

내 파일에서 캐럿 (^) 문자를 찾고 문자가 존재할 때마다 다음 문자를 삭제하려고합니다. . 나는 bash에서 이것을 실행하고있다.'s/([ ^] [^]) // g'로 끝나지 않은 's'명령

나는 시도하고 모든 시간은 그렇게 나오지 실행

sed: -e expression #1, char 14: unterminated `s' command 

어떤 아이디어 :

sed -i 's/([\^][^])//g' myfile.txt 

내가 아래에 오류가?

+0

'^'가 줄 끝 부분에 있다면 어떻게 하시겠습니까? 간결하고 테스트 가능한 샘플 입력과 예상 출력을 포함하도록 질문하십시오. –

+0

동일한 행동 - 나는 당신이이 엣지 케이스에 대해 걱정할 것이라고 생각조차하지 않았습니다. 감사. – dvasdekis

답변

3

발현 [^] 미완성 인 필요 누락 ] ([^]])가있다. 하지만 그것은 닫는 ]과 일치 할 것입니다, 당신이 원하는 것은 없습니다 (나는 믿습니다).

내가 생각하는 것은 캐럿과 일치하는 것입니다 : \^. 하지만 쓴 글 ([\^])도 캐럿과 일치하지 않습니다. \^.
: 의도 된 이후의 문자가 어떤 문자를 사용하는 경우

find any carat (^) ... and delete them and the subsequent character whenever they exist

:

$ echo 'abc\def^ghij' 
abc\def^ghij 

$ echo 'abc\def^ghij' | sed 's/[\^]//g' 
abcdefghij 

그러나 심지어 당신이 쓴되지 않는 것을 : 그것은 백 슬래시 \ 또는 캐럿 ^ 중 하나와 일치합니다 다음 문자가 캐럿이 아닌 문자 인 경우 \^[^\^]
또는 간단히 : \^[^^]

이다
$ echo 'ab\cd^^ef^gh' | sed 's/\^[^^]//g' 
ab\cd^fh 

:

sed -i 's/\^[^^]//g' infile 

당신이 찾고있는 무엇인가요?

+0

예! '\^.'는 완벽하게 작동했습니다. 건배! – dvasdekis

3

섹션 [^]은 문자 클래스가 아닙니다. ] 브래킷은 부정 문자 클래스의 첫 번째 문자이며 코드는 (문자 클래스의 일부로 모두 )//g 처리)을 찾고 오류를 발생시키는 끝 마커를 찾지 못합니다.

긍정적 인 경우 [][]을 사용하여 문자 클래스에서 닫는 대괄호 또는 열린 대괄호를 찾을 수 있습니다. 음수 버전은 [^][]입니다.

[^]]을 사용하면 오류 메시지가 중지됩니다. 그러면 사용자가 의도 한대로 정규식을 고쳐야합니다.

기본적으로 괄호는 그룹화 메타 문자가 아니라 괄호로 해석됩니다 (이 경우 \(…\)). 사실 그룹화 할 필요가 없으므로 괄호는 아래 토론에서 제외됩니다.

질문을 다시 읽을 때 정규 표현식에 대한 수정이 보통으로 취소됩니다. 캐럿과 그 다음 문자를 삭제하려고합니다. 그건 좀 모호합니다. 캐럿이 줄의 끝에 있으면 (다음 문자가 줄 바꿈이기 때문에), 줄 바꿈도 삭제해야합니까? 나는 그렇게하지 않을 것입니다. 또한 ^^을 삭제해야한다고 가정합니다. 질문은 '내 문자의 캐럿 (^) 문자를 말하고, 다음 문자도 캐럿이 아니면'그 문자를 지우지 않습니다 '라고 말합니다. 분명히, 정규식은 가정이 잘못 될 경우 조정될 수 있습니다 (새 라인 가정은 처리하기가 더 어렵지만 상당한 차이가 있음). 존재하는 경우

sed 's/\^.\{0,1\}//g' 

이 동일한 행에, 캐럿 (피 문자 클래스)과 다음 문자를 찾는다 - \{0,1\} 표기 이전 발현 0 또는 1 반복을 의미한다.

sed의 변형이 확장 정규 표현식을 지원하는 경우 sed -E 's/\^.?//g' (Mac OS X 및 BSD) 또는 sed -r 's/\^.?//g' (GNU)을 사용할 수 있습니다.

캐럿으로 구성된 문자 클래스는 실제로 POSIX에서 지원되지 않습니다. [\^] 표기법은 백 슬래시와 캐럿으로 구성된 문자 클래스 :

$ echo 'abc\de^Afg' | sed 's/[\^].\{0,1\}//g' 
abcefg 
$ echo 'abc\de^Afg' | sed 's/\^.\{0,1\}//g' 
abc\defg 
$ echo 'abc\de^Afg' | sed -E 's/\^.?//g' 
abc\defg 
$ echo 'abc\de^Afg' | /opt/gnu/bin/sed 's/[\^].\{0,1\}//g' 
abcefg 
$ echo 'abc\de^Afg' | /opt/gnu/bin/sed 's/\^.\{0,1\}//g' 
abc\defg 
$ echo 'abc\de^Afg' | /opt/gnu/bin/sed -r 's/\^.?//g' 
abc\defg 
$ 

(일반 sed 맥 OS X sed입니다 /opt/gnu/bin/sed은 GNU sed입니다 ('또는 캐럿'?).)

2

find any carat (^) characters in my file, and delete them and the subsequent character

의이 테스트 파일을 보자 :

$ cat myfile.txt 
a^2 b^2 c 

나는 이것이 당신이 원하는 것을 믿습니다 :

$ sed 's/\^.\?//g' myfile.txt 
a b c 

아시다시피, ^ 정규식 능동 캐릭터 일반적이다. 문자 그대로 ^과 일치하도록 이스케이프해야합니다. 정규식에서 .은 모든 문자와 일치합니다. 따라서 \^.은 임의의 문자가 오는 캐럿과 일치합니다. 다음 문자가있는 경우 정규 표현식 \^.\?은 캐럿과 다음 문자를 일치시킵니다. 문자 제외 목록으로 다음 캐럿 ^]을 사용하고 있기 때문에 나오지

+0

줄 끝에서 캐럿을 지우지는 않겠지 만이를 고치기는 어렵지 않습니다. 그리고'\^.'는 개행 문자 뒤에 개행 문자가 오는 캐럿과 일치합니다. –

+0

@JonathanLeffler 그런 식으로 OP의 진술을 해석하는 것이 합리적입니다. 답변이 업데이트되었습니다. – John1024

관련 문제