sed 개행 문자를 공백으로 교체

sed 개행 문자를 공백으로 교체

sed를 사용하여 개행 문자를 다른 문자로 바꾸는 방법은 무엇입니까?

입력하다:

 I cannot conceive that anybody will    
 require multiplications at the rate of 
 40,000 or even 4,000 per hour ...      

 -- F. H. Wales (1936)                  

원하는 출력:

I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ...  -- F. H. Wales (1936)

나는 시도했다:

> pbpaste | sed 's/\n/ /g' 

하지만 입력과 동일한 결과가 출력됩니다. 나는 그것을 확인했고 cat -ev예상대로 인쇄했기 때문에 이것이 개행 문자라는 것을 알고 있습니다.$

이 작업을 수행하는 더 좋은 명령이 있습니까?


이는 새 줄 사이에 추가 공간을 표시합니다. 저도 삭제하고 싶어요. 그래서 공백이 있는 문장과 같습니다.

> pbpaste | cat -ev
 I cannot conceive that anybody will    $
 require multiplications at the rate of $
 40,000 or even 4,000 per hour ...      $
                                        $
 -- F. H. Wales (1936)                  ⏎   

답변1

tr아마도 작업에 더 나은 도구 일 것입니다. 다음을 시도해 보세요

pbpaste | tr '\n' ' '

귀하의 입력을 바탕으로 다음과 같은 결과를 얻습니다.

I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ...  -- F. H. Wales (1936) 

답변2

다음 명령을 반복하면 sed(GNU slurp 확장이 없어도) 이 작업을 수행할 수 있습니다.-zN

$ sed -e :a -e '$!N;s/ *\n */ /;ta' -e 'P;D' input
 I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ... -- F. H. Wales (1936)                  

본질적으로 동일한 명령에 대한 설명은 예를 참조하세요.40. 이전 줄이 등호 "="로 시작하는 경우 이전 줄 뒤에 줄을 추가합니다.존재하다Sed 전문 용어 설명, 1부

답변3

@QIS에 동의합니다.

sed가 작동하지 않는 데에는 몇 가지 이유가 있습니다.

하나는 기본적으로 sed입력이 한 번에 한 줄씩 처리되므로 sed개행 문자가 표시되지 않는다는 것입니다.부분라인의. 구분 기호입니다.~ 사이알겠습니다. 기본적으로는 그렇습니다.

또 다른 문제는 GNU가 개행 표현을 sed구현하는 반면 BSD (OSX 버전)는 구현하지 않는다는 것입니다.'\n'sed

sed귀하의 질문을 읽을 미래의 GNU 사용자를 위해 sed이 옵션을 사용하여 GNU에 입력 파일을 NUL로 구분된 문자열 목록으로 처리하도록 지시할 수 있습니다 -z. 입력에 NUL 바이트가 포함되어 있지 않다고 가정하면 이는 sedGNU 사용자를 위한 옵션일 수 있습니다.

$ pbpaste | sed -z 's/\n/ /g'

echo간단하고 권장되지 않는 방법 은 명령 대체 때문에 인용되지 않은 개행 문자가 수신될 때 이를 공백으로 대체한다는 사실을 활용하는 것입니다 . 또한 echo여러 공백(또는 줄 바꿈)은 단일 공백으로 변환됩니다. 따라서 이것은 아마도 당신에게도 효과가 있을 것입니다:

echo $(pbpaste)

답변4

둘 다 텍스트 서식을 다시 지정하는 데 유용한 도구 fmt입니다 .par

둘 다 줄 바꿈을 공백으로 바꾼 후(예: ) 텍스트를 하나의 긴 줄로 다시 포맷하는 데 사용할 수 있습니다 tr.

$ tr '\n' ' ' < input.txt | fmt -w 999
I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ...    -- F. H. Wales (1936)

$ tr '\n' ' ' < input.txt | par w999
I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour ... -- F. H. Wales (1936)

fmt와 par의 출력은 약간 다릅니다. fmt 와 par ...사이에는 4개의 공백이 있지만 --par는 공백을 1개로 줄입니다.


fmt및에 대한 추가 정보 par:

fmt수십 년 동안 사용되어 왔으며 거의 ​​모든 UNIX 시스템에서 사용할 수 있는 표준 유틸리티입니다. GNU/Linux 시스템에서는 coreutilsGNU 패키지에 있습니다 .

$ fmt < input.txt 
I cannot conceive that anybody will require multiplications at the rate
of 40,000 or even 4,000 per hour ...

  -- F. H. Wales (1936)

그러나 이는 매우 간단하며 단락 형식을 다시 지정하는 방법에 대한 많은 제어를 허용하지 않으며, 혼란스러운 혼란을 초래할 수 있는 선행 및/또는 후행 문자(예: >이메일이나 /* ... */댓글의 인용)에 대한 특별한 처리를 수행하지 않습니다.

par더 유연하고 유능합니다. C 스타일 /* ... */주석과 상자 텍스트, 다단계 참조가 포함된 이메일 등의 형식을 다시 지정할 수 있습니다. 다음 예에서는 실제로 수행되는 작업을 보여주지 않습니다.

$ par < input.txt 
I cannot conceive that anybody will require multiplications at the rate of
40,000 or even 4,000 per hour ...

  -- F. H. Wales (1936)

다음 예제( )에서는 기능을 man par보여주기 시작합니다 .par

Before:

   John writes:
   : Mary writes:
   : + Anastasia writes:
   : + > Hi all!
   : + Hi Ana!
   : Hi Ana & Mary!
   Please unsubscribe me from alt.hello.

After "par Q+:+ q":

   John writes:

   : Mary writes:
   :
   : + Anastasia writes:
   : +
   : + > Hi all!
   : +
   : + Hi Ana!
   :
   : Hi Ana & Mary!

   Please unsubscribe me from alt.hello.

1990년대에 이 기능을 발견한 이후 저는 vi/vim에서 제가 작성 중인 이메일(또는 읽을 수 없는 긴 줄이 있는 다른 사람이 보낸 이메일), 코드 주석 및 기타 텍스트의 형식을 다시 지정하기 위해 매일 이 기능을 사용해 왔습니다. IMO, par는 빼놓을 수 없는 필수 프로그램입니다.

관련 정보