![Bash에서 후행 줄 바꿈을 제거하는 방법은 무엇입니까?](https://linux55.com/image/39282/Bash%EC%97%90%EC%84%9C%20%ED%9B%84%ED%96%89%20%EC%A4%84%20%EB%B0%94%EA%BF%88%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
저는 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"
스크립트는 항상 현재 줄 대신 이전 줄을 인쇄하며 마지막 줄은 다르게 처리됩니다.
자세한 내용은 다음과 같습니다.
NR>1{print PREV}
이전 줄을 인쇄합니다(처음 줄 제외).{PREV=$0}
현재 행을PREV
변수에 저장합니다.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