![sed 개행 문자를 공백으로 교체](https://linux55.com/image/160637/sed%20%EA%B0%9C%ED%96%89%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EA%B3%B5%EB%B0%B1%EC%9C%BC%EB%A1%9C%20%EA%B5%90%EC%B2%B4.png)
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 확장이 없어도) 이 작업을 수행할 수 있습니다.-z
N
$ 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 바이트가 포함되어 있지 않다고 가정하면 이는 sed
GNU 사용자를 위한 옵션일 수 있습니다.
$ 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 시스템에서는 coreutils
GNU 패키지에 있습니다 .
$ 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는 빼놓을 수 없는 필수 프로그램입니다.