Bash에서 후행 줄 바꿈을 제거하는 방법은 무엇입니까?

Bash에서 후행 줄 바꿈을 제거하는 방법은 무엇입니까?

저는 Perl처럼 동작하는 것을 찾고 있습니다 chomp. 입력 내용을 단순히 인쇄하고 줄 바꿈인 경우 마지막 문자를 빼는 명령을 찾고 있습니다.

$ printf "one\ntwo\n" | COMMAND_IM_LOOKING_FOR ; echo " done"
one
two done
$ printf "one\ntwo" | COMMAND_IM_LOOKING_FOR ; echo " done"
one
two done

(Bash와 Zsh의 명령 대체는 모든 후행 개행을 제거하지만 최대 하나의 후행 개행을 제거하는 것을 찾고 있습니다.)

답변1

perl다음 없이도 할 수 있습니다 chomp.

$ printf "one\ntwo\n" | perl -pe 's/\n\z// if eof'; echo " done"
one
two done

$ printf "one\ntwo" | perl -pe 's/\n\z// if eof'; echo " done"
one
two done

하지만 직접 사용해 보는 것은 어떨까요 chomp?

$ printf "one\ntwo\n" | perl -pe 'chomp if eof'; echo " done"

답변2

이것은 작동합니다:

printf "one\ntwo\n" | awk 'NR>1{print PREV} {PREV=$0} END{printf("%s",$0)}' ; echo " done"

스크립트는 항상 현재 줄 대신 이전 줄을 인쇄하며 마지막 줄은 다르게 처리됩니다.

자세한 내용은 다음과 같습니다.

  1. NR>1{print PREV}이전 줄을 인쇄합니다(처음 줄 제외).
  2. {PREV=$0}현재 행을 PREV변수에 저장합니다.
  3. END{printf("%s",$0)}마지막으로 줄 바꿈 없이 마지막 줄을 인쇄합니다.

또한 이렇게 하면 끝에서 최대 하나의 빈 줄이 제거됩니다(제거는 지원되지 않음 "one\ntwo\n\n\n").

답변3

완전히 동등한 방법을 원한다면 chomp내 마음에 가장 먼저 떠오르는 방법은LatinSuD가 awk 솔루션을 출시했습니다.. 구현하지는 않지만 chomp자주 사용되는 몇 가지 일반적인 작업을 구현하는 다른 메서드를 추가하겠습니다 .chomp

변수에 일부 텍스트를 채우면 끝에 있는 모든 줄 바꿈이 제거됩니다. 따라서 이러한 모든 명령은 동일한 단일 출력 라인을 생성합니다.

echo "$(printf 'one\ntwo') done"
echo "$(printf 'one\ntwo\n') done"
echo "$(printf 'one\ntwo\n\n') done"
echo "$(printf 'one\ntwo\n\n\n\n\n\n\n\n\n\n') done"

이것은 파일이나 명령 출력의 마지막 줄에 일부 텍스트를 추가하려는 경우에 sed편리합니다 . GNU sed 및 대부분의 다른 최신 구현에서는 입력이 개행 문자로 끝나지 않더라도 작동하지만, 아직 개행 문자가 없으면 개행 문자가 추가되지 않습니다.

sed '$ s/$/ done/'

1 그러나 이는 모든 sed 구현에 적용되지 않습니다. sed는 텍스트 처리 도구이며 비어 있지 않고 개행 문자로 끝나지 않는 파일은 텍스트 파일이 아닙니다.

답변4

또 다른 perl방법. 이는 전체 입력을 메모리로 읽으므로 많은 양의 데이터의 경우 이는 좋은 생각이 아닐 수 있습니다(cuonglm 또는 awk이 방법 사용).

$ printf "one\ntwo\n" | perl -0777pe 's/\n$//'; echo " done"
one
two done

관련 정보