배쉬 : 출력에서 ​​후행 줄 바꿈


답변:


251

예상 출력이 한 줄이면 출력에서 ​​모든 개행 문자를 간단히 제거 할 수 있습니다. 'tr'유틸리티 또는 선호하는 경우 Perl로 파이프하는 것은 드문 일이 아닙니다.

wc -l < log.txt | tr -d '\n'

wc -l < log.txt | perl -pe 'chomp'

명령 대체를 사용하여 후행 줄 바꿈을 제거 할 수도 있습니다.

echo -n "$(wc -l < log.txt)"

printf "%s" "$(wc -l < log.txt)"

승인 된 답변을 선택하기로 한 OP의 결정에 동의하지 않습니다. 가능한 경우 'xargs'를 사용하지 않아야한다고 생각합니다. 예, 멋진 장난감입니다. 아니요, 여기 필요하지 않습니다.


예상 출력에 여러 줄이 포함될 수있는 경우 다른 결정을 내려야합니다.

파일 끝에서 MULTIPLE 개행 문자를 제거하려면 cmd 대체를 다시 사용하십시오.

printf "%s" "$(< log.txt)"

파일에서 마지막 개행 문자를 엄격하게 제거하려면 Perl을 사용하십시오.

perl -pe 'chomp if eof' log.txt


제거하려는 후행 줄 바꿈 문자가 확실하다면 GNU coreutils에서 'head'를 사용하여 마지막 바이트를 제외한 모든 것을 선택할 수 있습니다. 이것은 매우 빠릅니다.

head -c -1 log.txt

또한 완전성을 위해 'cat'및 'show-all'플래그를 사용하여 줄 바꿈 (또는 기타 특수 문자)이 파일에서 어디에 있는지 신속하게 확인할 수 있습니다. 달러 기호 문자는 각 줄의 끝을 나타냅니다.

cat -A log.txt

제목이 요구하는 마지막 줄 바꿈뿐만 아니라 출력에서 ​​모든 줄 바꿈을 제거합니다.
Cody A. Ray

@ CodyA.Ray : 그러나이 질문은 단 한 줄의 출력 만 생성하는 특정 명령을 설명한다는 데 동의해야합니다. 그러나 더 일반적인 경우에 맞게 답변을 업데이트했습니다. HTH.
Steve

3
짧은 옵션을 긴 옵션으로 바꾸면 더 좋습니다. 긴 옵션은 기능뿐만 아니라 가르쳐 tr --delete '\n'줍니다.
Elijah Lynn

1
나도| tr -d '\r'
AlikElzin-kilaka

파일이 매우 큰 경우 cmd 대체 솔루션으로 인해 줄이 길어질 수 있습니다.
phk

88

일방 통행:

wc -l < log.txt | xargs echo -n

24
더 나은 :echo -n `wc -l log.txt`
사티

9
파이프를 사용하는 것보다 백틱에서 명령 실행이 더 나은 이유는 무엇입니까?
Matthew Schinckel

2
이것들은 후행 줄 바꿈을 제거 할뿐만 아니라 연속 공백을 (보다 정확하게 정의 된대로 IFS) 한 공간 으로 압축합니다 . 예 : echo "a b" | xargs echo -n; echo -n $(echo "a b"). 유스 케이스에 문제가 될 수도 있고 아닐 수도 있습니다.
musiphil

14
더 나쁜 것은, 출력이로 시작 -e하면에 대한 옵션으로 해석됩니다 echo. 사용하는 것이 항상 더 안전합니다 printf '%s'.
musiphil

1
xargs시스템에서 속도가 매우 느리며 (다른 시스템에도 있다고 생각합니다) 일반적으로 내장되어 있기 때문에 printf '%s' $(wc -l log.txt)더 빠를 수 있습니다 printf(정보 리디렉션이 없기 때문에). 백틱을 사용하지 마십시오. 최신 POSIX 버전에서는 더 이상 사용되지 않으며 수많은 단점이 있습니다.
yyny

14

Bash 변수 대체 에서 공백 제거를 직접 지원합니다 .

testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}

1
trailing_linebreak_removed=${testvar%?}
PairedPrototype

명령 대체를 사용하는 경우 후행 줄 바꾸기를 제거하기 위해 아무 것도 수행 할 필요가 없습니다. Bash는 이미 명령 대체의 일부로 gnu.org/software/bash/manual/html_node/…
Michael Burr

10

출력을 변수에 할당하면 bash공백이 자동으로 제거됩니다.

linecount=`wc -l < log.txt`

10
후행 줄 바꿈은 정확하게 제거됩니다. 변수 할당이 아니라 제거하는 명령 대체입니다.
chepner

2
Cygwin bash에서 $ (cmd / c echo % VAR %)를 사용할 때 후행 공백이 제거되지 않는 것을 보았습니다. 이 경우 $ {var %% [[: space :]]}를 사용해야했습니다.
Andrey Taranov

1
참고 : 변수 할당이 아니라 개행을 제거하는 표현식 확장입니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

10

printf는 이미 후행 줄 바꿈을 자릅니다.

$ printf '%s' $(wc -l < log.txt)

세부 묘사:

  • printf는 %s문자열 자리 표시 자 대신 내용을 인쇄합니다 .
  • 줄 바꿈 ( %s\n) 을 인쇄하도록 지시하지 않으면 그렇지 않습니다.

7
과 같이 명령에 큰 따옴표를 넣으면 "$(command)"내부 줄 바꿈이 유지되고 후행 줄 바꿈 만 제거됩니다. 쉘은 여기서 모든 작업을 수행하고있다 . printf명령 대체 결과를 다시 지시하는 방법 일 뿐이다 stdout.
브렌트 브래드 번

2
여기서 새 줄을 지우는 것은 printf가 아니며, $( )구문을 사용하여 수행하는 쉘입니다 . 증거는 다음과 같습니다.printf "%s" "$(perl -e 'print "\n"')"
Flimm

다시 말하지만 결과 명령 줄이 너무 길어질 수 있습니다.
phk

이것은 @nobar의 제안으로 편리한 솔루션입니다 :$ printf '%s' "$(wc -l < log.txt)"
Ilias Karim

10

마지막 개행 만 제거 하려면 다음을 통해 파이프하십시오.

sed -z '$ s/\n$//'

sed\0구분 기호가 NULvia 로 설정된 경우 스트림 끝에 a 를 추가하지 않고 -zPOSIX 텍스트 파일 (a로 끝나도록 정의 됨)을 만들려면 \n항상을 사용 \n하지 않고 final 을 출력합니다 -z.

예 :

$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender

그리고 NUL추가 되지 않음을 증명하기 위해 :

$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72                        foo.bar

후행 줄 바꿈을 여러 개 제거 하려면 다음을 통해 파이프하십시오.

sed -Ez '$ s/\n+$//'

나는 이것이 GNU 확장이라고 가정하고 Mac sed은 제공하지 않습니다 -z.
Spidey

7

줄 끝없이 Bash에서 출력물을 출력하려면 -n스위치를 사용하여 출력하십시오 .

변수에 변수가 있다면, 줄 바꿈 줄 바꿈으로 에코하십시오 .

    $ testvar=$(wc -l < log.txt)
    $ echo -n $testvar

또는 한 줄로 대신 할 수 있습니다.

    $ echo -n $(wc -l < log.txt)

2
변수는 기술적으로 불필요합니다. echo -n $(wc -l < log.txt)같은 효과가 있습니다.
chepner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.