해당 줄에 텍스트를 추가하려면 파일의 마지막 줄에서 개행 문자를 어떻게 제거합니까?

해당 줄에 텍스트를 추가하려면 파일의 마지막 줄에서 개행 문자를 어떻게 제거합니까?

다음과 같은 파일이 있다고 가정해 보겠습니다 file.

$ cat file
Hello
Welcome to
Unix

and Linux파일의 마지막 줄 끝에 추가하고 싶습니다 . 이렇게 하면 echo " and Linux" >> file새 줄이 추가됩니다. 하지만 난 마지막 줄을 원해Unix and Linux

그래서 이 문제를 해결하기 위해 파일 끝에 있는 개행 문자를 제거하고 싶습니다. 그러면 해당 줄에 텍스트를 추가할 수 있도록 파일 끝에 있는 개행 문자를 어떻게 제거합니까?

답변1

마지막 줄에 텍스트를 추가하려면 sed를 사용하는 것이 매우 쉽습니다. (줄 끝의 패턴 일치) 를 범위의 줄(즉, 마지막 줄)에만 $추가하려는 텍스트로 바꾸세요.$

sed '$ s/$/ and Linux/' <file >file.new &&
mv file.new file

Linux에서는 다음과 같이 단축할 수 있습니다.

sed -i '$ s/$/ and Linux/' file

파일의 마지막 바이트를 제거하려는 경우 Linux(더 정확하게는 GNU coreutils)는 다음을 제공합니다.truncate명령을 사용하면 이 작업이 매우 쉬워집니다.

truncate -s -1 file

POSIX 접근 방식 중 하나는 dd.

length=$(wc -c <file)
dd if=/dev/null of=file obs="$((length-1))" seek=1

이 두 가지 모두 무조건 파일의 마지막 바이트를 자릅니다. 먼저 개행 문자인지 확인하고 싶을 수도 있습니다.

length=$(wc -c <file)
if [ "$length" -ne 0 ] && [ -z "$(tail -c -1 <file)" ]; then
  # The file ends with a newline or null
  dd if=/dev/null of=file obs="$((length-1))" seek=1
fi

답변2

Perl을 사용하면 다음과 같이 이를 달성할 수 있습니다.

perl -pi -e 'chomp if eof' myfile

대조적으로, truncate실제로 후행 줄 바꿈이 없으면 dd손상된 파일이 남지 않습니다 .myfile

(답은 다음과 같습니다.논평, 그리고 이를 기반으로이 답변)

답변3

그러나 다음을 사용하여 모든 줄에서 개행 문자를 제거할 수 있습니다 tr -d '\n'.

$ echo -e "Hello"
Hello
$ echo -e "Hello" | tr -d '\n'
Hello$

다음과 같은 간단한 방법을 사용하여 파일 끝에 있는 개행 문자를 제거할 수 있습니다.

  1. head -c -1 file

에서 man head:

    -c, --bytes=[-]K
              print the first K bytes of each file; with the leading '-',
              print all but the last K bytes of each file
  1. truncate -s -1 file

에서 man truncate:

    -s, --size=SIZE
              set or adjust the file size by SIZE
SIZE는 선택적 단위가 있는 정수입니다(예: 10M은 10*1024*1024입니다). 단위는 K, M, G, T, P, E, Z, Y(1024의 거듭제곱) 또는 KB, MB, ...(1000의 거듭제곱)입니다. SIZE 앞에는 다음 수정자 문자 중 하나가 앞에 붙을 수 있습니다. 확장하려면 "+", 감소하려면 "-", 둘 이상으로 반올림하려면 "/", 둘 이상으로 반올림하려면 "%" 하나.

답변4

perl -0pi -e "s/\R\z//g" file

"\r"(MAC), "\r\n"(Windows) 및 "\n"(Linux)에 적용됩니다. 파일 끝(모든 프롬프트)에서 반복되는 개행의 경우 다음을 수행할 수 있습니다.

perl -0pi -e "s/\R*\z//g" file

관련 정보