2010-12-15 4 views
15

BSD 일반 명령에서 sed를 사용하여 mac에서 sed를 사용하여 하나 이상의 문자를 찾아서 바꾸려고합니다.mac os x (BSD) sed에서 더하기 기호를 이스케이프하는 방법?

echo "foobar" | sed -e "s/o+//g 

보고 기대 :

나는 시도

fbar 

을하지만 그 대신 나는

foobar 

나는 물론 단지 수동으로 플러스를 확장 할 수 있습니다 참조 :

echo "foobar" | sed -e "s/oo*//g" 

하지만 더하기 기호를 사용하려면 어떻게해야합니까?

+0

'/ g'플래그를 사용하면 's/o // g'는 모든 'o'어커런스를 대체하기에 충분합니다. – khachik

답변

27

/g 플래그를 사용하면 s/o//g이면 모든 발생을 대체 할 수 있습니다. 예상대로 + 작동하지 않는 이유는

: 옛날, 오래된 + 다시는 일반 문자 (뿐만 아니라 |, ?)입니다. 당신은 현대의 정규 표현식을 사용하기 위해 sed-E 플래그를 지정해야합니다

echo "foobar" | sed -E -e "s/o+//" 
# fbar 

출처 : man 7 re_format합니다.

+0

+1,'-E' 플래그로 설명 된대로 작동합니다. 웬일인지 나는 사람/정보 페이지에서 그것을 발견 할 수 없었다. 공식적으로'-r'과'--regexp-extended' 옵션이 갈 길입니다. – Chriki

2
echo "foobar" | sed -e "s/o\\+//g" 

(Mac OS X 10.6)

내 BSD 버전의 sed를 GNU sed 4.2로 대체했기 때문에이 방법이 효과가 있거나 그렇지 않을 수도 있습니다.

+0

10.5에서 작동하지 않습니다 ... – khachik

+0

Terminal.app에서 이중 백 슬래시를 사용해야 할 수도 있습니다. – eyelidlessness

+0

@eyelidlessness 작동하지 않습니다. 자세한 내용은 내 대답을 참조하십시오. – khachik

0

Sed는 regexes에 슬픈입니다. 당신은 BSD와 함께 작동 수있는 -E를 시도 할 수하거나, 대신이 일을 시도 할 수 :

sed -e "s/o\{1,\}/" 

은 아마도 모든 시스템에 사용할 수있는 도구가 거기에서 너무 많은 SED의의가있다.

0

Linux 또는 유닉스에서 사용할 수 있습니다.

echo "foobar" | perl -pe "s/o+//g" 
+0

이 질문에 대한 답을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남기십시오. 자신의 게시물에 언제나 댓글을 달 수 있으며 충분한 [평판] (http://stackoverflow.com/help/whats-reputation)을 갖게되면 [모든 게시물에 댓글을 달 수] 있어야합니다 (http://stackoverflow.com/help/privileges/comment). –

+0

이 방법을 사용하면 문제를 해결할 수 있으며 이스케이프 문제에 신경 쓸 필요가 없습니다. –