sed에서 공백을 일치시키는 방법은 무엇입니까?


218

sed에서 공백을 어떻게 일치시킬 수 있습니까? 내 데이터에서 3 개 이상의 후속 공백 문자 (탭 공백)를 모두 일치시키고 2 공백으로 바꿉니다. 이것을 어떻게 할 수 있습니까?

답변:


226

문자 클래스는 \s공백 문자와 일치합니다 <tab>하고 <space>.

예를 들면 다음과 같습니다.

$ sed -e "s/\s\{3,\}/  /g" inputFile

최소 3 개의 공백 문자를 2 개의 공백으로 바꿉니다.


고지 : POSIX 호환을 위해서는 s [[:space:]]대신 문자 클래스 를 사용하십시오 \s. 후자는 GNU sed 확장자이기 때문입니다. sedBRE에 대한 POSIX 사양을 참조하십시오


5
아하! 나를 놓친 것은 빠진 -e 스위치였습니다.
mcdowell

25
또한 확장 정규 표현식이 sed가 '\ s'를 공백으로 인식하도록하는 '-r'스위치를 추가해야했습니다.
HUB

39
Apple의 경우 sed나에게 효과가 [[:space:]]없었기 때문에 사용해야했습니다 \s. 아마도 \sA는 GNU는 나오지 확장?
Jared Beck

2
내 간단한 정규식 않네의 작업이 ..이 절름발이 이유 @JaredBeck 덕분에, 아이디어가 부족했다, 나는 .. 또한 나던 작업 -r \의 표준 확장 정규식라고 생각하고 -E는 쪼그리고 한
KARTHIK T에게

3
대신 가로 탭과 공백에만 일치하는 [[:space:]줄을 사용할 수 있습니다 [[:blank:]](그러나 줄 바꿈, 세로 탭 등은 제외).
stefanct

67

이것은 MacOS 10.8에서 작동합니다.

sed -E "s/[[:space:]]+/ /g"

2
이것이 모든 Linux 배포판에서 작동하는지 알고 있습니까?
양서류

2
일반적으로 GNU sed 에는 -E가 없습니다. BSD sed 매뉴얼 페이지에서 : "-E, -a 및 -i 옵션은 비표준 FreeBSD 확장이며 다른 운영 체제에서는 사용할 수 없습니다."
Brad Koch

1
+ 연산자에 왜 -E 플래그가 필요합니까? 대부분의 표현식은 * 대신에 괜찮을 것입니다. 그러면 다른 플랫폼에서 작동합니다.
Samuel

5
@Samuel *를 사용하면 정규식은 0 개 이상의 공백과 일치하며 모든 문자 사이와 공백이 각 줄의 끝에 나타납니다. -E 플래그가없는 경우 sed "s/[[:space:]]\+/ /g"하나 이상의 공백을 일치 시키려고합니다.
jbo5112

1
FBSD는 NetBSD의 sed도 -E플래그를 지원합니다 .
mcandre

13

sed의 일부 이전 버전은 \ s를 공백 일치 토큰으로 인식하지 못할 수 있습니다. 이 경우 하나 이상의 공백과 탭을 '[XZ] [XZ] *'와 일치시킬 수 있습니다. 여기서 X는 공백이고 Z는 탭입니다.


1
따라서 오래된 sed를 사용하여 여기에서 특정 요구 사항을 수행 할 수 있습니다. $ sed 's / [XZ] [XZ] [XZ] [XZ] * / / g'inputfile 여기서 X는 탭이고 Z는 공백입니다.
Marnix A. van Ammers

10
sed 's/[ \t]*/"space or tab"/'

2
sed시스템 의 모든 버전에서 작동 합니까? 그렇지 않다면 이것이 다른 답변과 비슷한 방식으로 작동하는 곳을 언급 할 가치가있을 것입니다. 우리는 한계를 알고 이것이 의도 한 결과를 얻지 못할 수도 있습니다.
Mokubai

2
이 RE는 공백과 일치시키기 위해 사용하는 것입니다. 탭이나 공백과 일치시키는 것이 문자 클래스보다 간단합니다. 가장 기본적인 정규 표현식 규칙 만 사용하므로 정규 표현식의 기능적 구현으로 어디서나 작동해야합니다.
Nate

3
Mac 10.9.5에서는 공백 및 't'와 일치합니다. 위의 Michael Douma를 사용하여 공백 문자를 찾습니다 (-e 와도 작동).
외국인 생활 양식

SUSE 시스템에서 현명하게 작동하지 않습니다. 공백이없는 줄의 첫 번째 문자와 일치합니다. 첫 번째 문자 앞에 있습니다. 의도 한 기능인지 의심스럽고 요청 된 사용 사례가 아닌 것 같습니다. '\ +'(또는 질문에 따라 '\ {3, \}')에 대해 '*'를 변경하고 sed 명령 끝에 ag를 넣어 패턴의 모든 발생과 일치시킬 수 있습니다. 줄에 공백이 필요한 경우 [\ t]를 [[: space :]]로 바꾸는 것도 바람직 할 수 있습니다.
jbo5112
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.