문장이 끝난 후 두 공백의 모든 발생을 단 하나의 공백으로 대체


9

sed 명령으로 정규 표현식을 포함하고 있습니다.

문 : 문장끝난 후 두 칸의 공백을 한 칸만 바꾸고 싶습니다 .

여기 내가 한 일이 있습니다.

sed 's/^ $/^$/' file  

그리고 문장이 끝난 후 하나의 공백으로 두 공백을 대체하지 않았습니다.

내가 얻는 결과 :

This is the output.  Hello Hello

내가 원하는 결과 :

This is the output. Hello Hello

@Rahul 문장이 끝난 후 한 번 공백이 포함 된 출력을 원합니다. 첫 문장과 같이 두 칸이 없습니다. 두 번째 문장 출력을 원합니다
Zeus

@Jasen의 답변은 정확합니다. BTW, 당신이 시도한 명령은 다음을 의미합니다. 하나의 whitspace로만 구성된 줄을 빈 줄로 바꿉니다. 이것이 당신이 원하는 것을하지 않은 이유입니다.
rexkogitans

1
여기에 삽입 : 단일 대 이중 공간에 전쟁을 완전 정지 후
리트

@gerrit 그 전쟁은 약 20 년 전에졌습니다. ;)
h4ckNinja

답변:


12
 sed 's/\.   */. /g' < file

점 다음에 두 개 이상의 공백을 바꾸고 점 뒤에 단일 공백을 넣으십시오.


귀하의 명령은 실제로 전체 단락에 적용됩니다. 그것이 바로 내가 원하는 것입니다. 감사!
Zeus

또는 sed -r 's/\.\s+/. /g' fileGNU sed와 함께
Sundeep

@spasic sed -E대신에 사용하십시오 sed -r. 이것은 GNU sed 및 * BSD sed (Mac OS X 포함) 및 다른 것들과 호환됩니다. POSIX에 "현재 곧"표준으로 포함될 예정입니다.
cas

@cas 언젠가 기억 나지만, sed -E이 사이트에서 작동하지 않았지만 sed -r일했던 누군가에게 제안 했습니다. 나는 GNU sed만으로 작업 했으므로 POSIX 및 기타 변형에 대해서는 전혀 모릅니다. , 감사합니다 :)
Sundeep

GNU sed의 이전 버전이어야합니다. 그들은 -E지금까지 꽤 오랫동안 지원해 왔습니다 (최소한 2011 년 이후로 매뉴얼과 정보 페이지는 여전히 언급 할 것입니다 -r)
cas

13

당신의 sed명령 's/^ $/^$/'은 당신이 원하는 것을하지 않을 것입니다. 하나의 공백을 포함하는 모든 행을 한 줄 포함으로 바꿉니다 ^$.

문장의 끝을 나타내는 문자에 따라 다음을 수행 할 수 있습니다.

sed -e 's/\([.?!]\) \{2,\}/\1 /g' <file

이 후 2 이상의 공백을 대체 할 것이다 ., ?또는 !하나 개의 공간.


1
sed -r 's/([.?!])\s+/\1 /g' file
Sundeep

감사. 그러나 왜 이렇게 많은 둥근 대괄호를 사용했는지 친절하게 설명하겠습니까? 조금 혼란 스럽습니다.
Zeus

1
@spasic : GNU sed에서만 작동하며 단순화 된 버전으로 업데이트되었습니다.
cuonglm

@ Zeus : 기본 BRE의 표준 구문입니다.
cuonglm

1
아니요, 원래 sed편집 스크립트는 단일 공백을 포함하는 모든 행을 리터럴 문자열로 바꿉니다 ^$.
Kusalananda

7

이것은 당신이 찾고있는 것입니다.

tr -s " " <filename

견본,

$ echo "This is the output.  Hello Hello" | tr -s "[:blank:]"
This is the output. Hello Hello

사용하여 sed,

$ echo "This is the output.  Hello Hello" | sed 's/\. \+/. /g'
$ echo "This is the output.  Hello Hello" | sed 's/\. \{1,\}/. /g'
This is the output. Hello Hello

2
글쎄, 그것은 고마워하지만 sed 명령을 포함해야합니다. sed에서 대체, 텍스트 변경 등과 같이 위에 표시된 것과 비슷한 것을 친절하게 말하십시오.
Zeus

2
이 tr 기능을 몰랐습니다
Jasen

3
이 접근법은 문장의 끝이 아닌 두 개의 공백을 대체합니다.
cuonglm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.