작성자 줄에 대해 유지하면서 Fortune 출력에서 ​​강제 개행을 제거합니다.

작성자 줄에 대해 유지하면서 Fortune 출력에서 ​​강제 개행을 제거합니다.

최근에 저는 이 멋진 명령을 발견 fortune하고 즉시 이를 사용하여 지속적인 채팅에 매일 밤 인용문을 보냈습니다.

이제 강제 개행을 제거하는 방법을 알고 싶습니다.인용 부호, 하지만 보관해 두세요작성자 행마지막에.

왜? 채팅 창의 폭이 다르기 때문에 대부분의 경우 생성된 출력은 이중 래핑됩니다. (이것은 잘 표현되지는 않지만 아마도 제가 의미하는 바를 이미 이해하셨을 것입니다. 그렇지 않은 경우 이것은 귀하에게 중요합니다. 자유롭게 문의하십시오. 설명 ).

물론 솔루션을 검색하여 다음을 찾았습니다.

echo -n `fortune`

그러나 이것은 분명히 모든 개행 문자를 제거합니다.

호환 가능한 솔루션이 가장 높이 평가 sh되지만 단순성이 크게 향상되면 bash(다른?) 옵션도 가능합니다.


2016년 2월 12일에 업데이트되었습니다:

요청에 따라 여러 줄의 부를 출력하는 예:

me@myhost:~$ fortune
Mit jemand leben oder in jemand leben, ist ein großer 
Unterschied. Es gibt Menschen, in denen man leben kann, ohne mit 
ihnen zu leben, und umgekehrt. Beides zu verbinden, ist nur der 
reinsten Liebe und Freundschaft möglich.
        -- Goethe, Maximen und Reflektionen, Nr. 649
me@myhost:~$ 

아래 제안된 솔루션은 이를 수행할 수 있습니다.

me@myhost:~$ fortune | sed ':a;N;$!ba;s/\n[[:space:]]\{2\}--/ --/'
Die so genannten Naturdichter sind frisch und neu aufgeforderte, 
aus eine rüberbildeten, stockenden, manierierten Kunstepoche 
zurückgewiesene Talente. Dem Platten können sie nicht ausweichen, man 
kann sie daher als rückschreitend ansehen; sie sind aber 
regenerierend und veranlassen neue Vorschritte. -- Goethe, Maximen und Reflektionen, Nr. 258
me@myhost:~$ 

이는 매우 좋은 제안이지만 원하는 정확한 솔루션을 제공하지는 않습니다. 그것은 내가 달성하고 싶은 것과 정반대입니다. sed 표현을 이해하고 나면 논리를 반대로 바꾸려고 노력할 것입니다... 가능한 한 빨리 해보세요! :디

답변1

echo $(fortune) | sed 's/-- /\n    -- /'

작성자 줄 앞에 선행 공백을 삽입하세요. 이는 단지 echo캐리지 리턴을 제거하고 작성자 접두어를 개행 및 작성자 접두어로 대체합니다.

답변2

이것의 대부분은 도난당했습니다.여기:

fortune | sed ':a;N;$!ba;s/\n[[:space:]]\{2\}--/ --/'

원래 답변에서 :

설명하다:

  1. 태그를 생성하여 :a.
  2. 현재 줄과 다음 줄을 패턴 공간에 추가합니다 N.
  3. 마지막 줄 앞에 있으면 생성된 레이블로 분기합니다 $!ba( $!마지막 개행이 있어야 하므로 마지막 줄에서는 이 작업을 수행하지 마십시오).

마지막 단계는 제가 수정한 유일한 단계입니다. 패턴은 연결된 두 줄이므로 검색 --앞에 두 개 이상의 공백과 개행 문자가 옵니다(내가 아는 한 패턴은 따옴표 안에만 나타납니다). 개행 문자를 공백으로 바꾸고 --삭제된 내용을 다시 추가합니다.

앞으로:

There is always one thing to remember: writers are always selling somebody out.    
            -- Joan Didion, "Slouching Towards Bethlehem"

뒤쪽에:

There is always one thing to remember: writers are always selling somebody out. -- Joan Didion, "Slouching Towards Bethlehem"

답변3

파일을 단일 문자열로 처리한 다음 개행 문자와 두 개의 개행 문자만 바꿀 수 있습니다. 이 솔루션은 공백이 아닌 줄을 가정합니다.

bash-4.1$ cat input 
duck
duck
duck
  -- goose
bash-4.1$ perl -0777 -ple 's/\n(?=[^\n]+\n[^\n]+\n)/ /g' input
duck duck duck
  -- goose
bash-4.1$ 

또 다른 해결책은 라인을 메모리 내 라인 배열로 만든 다음 해당 배열을 공백으로 연결하거나(마지막 라인 제외), 먼저 라인 수를 계산한 다음 해당 숫자를 사용하여 줄 바꿈 시기를 결정하는 것입니다. 공백으로 변환하거나 단독으로 유지해야 합니다.

관련 정보