파일 끝에서 줄 바꿈 문자를 어떻게 제거합니까?


32

줄 바꿈 문자에 대해 명확히하겠습니다.

$ echo Hello > file1 ; cat file1
Hello
$ echo -n  Hello > file2 ; cat file2
Hello$ 

여기서 file1줄 끝에 개행 문자가 있지만 file2그렇지 않은 것을 볼 수 있습니다 .

이제 내가 하나 있다고 가정 해보십시오 file.

$ cat file
Hello
Welcome to
Unix
$

그리고 and Linux파일 끝에 추가하고 싶은 경우 echo " and Linux" >> file개행에 추가됩니다. 그러나 나는 마지막 줄을 원한다.Unix and Linux

따라서 해결하려면 파일 끝에서 줄 바꿈 문자를 제거하고 싶습니다. 따라서 파일 끝에서 줄 바꿈 문자를 어떻게 제거합니까?


6
제거하지 말고 텍스트 편집기를 사용하십시오. sed '$s/$/ and linux/'
123

답변:


27

마지막 줄에 텍스트를 추가하기 만하면 sed를 사용하면 매우 쉽습니다. $범위의 줄 $(마지막 줄) 에서만 추가하려는 텍스트로 줄 끝의 패턴 일치를 바꿉니다 .

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

리눅스에서 단축 할 수있는

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

파일에서 마지막 바이트를 제거하려면 Linux (보다 정확하게는 GNU coreutils)가 truncate명령을 제공하므로이 작업이 매우 쉽습니다.

truncate -s -1 file

POSIX 방법은입니다 dd. 먼저 파일 길이를 결정한 다음 1 바이트 이하로 자릅니다.

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

9
후행 줄 바꿈을 제거하는 훨씬 더 좋은 방법perl -pi -e 'chomp if eof' myfile입니다. 비교 truncate또는 dd경우 깨진 파일과 함께 당신을 떠나지 않을거야 myfile실제로 더 뒤에 줄 바꿈을했다.
Hi-Angel

2
@ Hi-Angel 답변으로 작성하는 것이 좋습니다. 나는 그것이 매우 좋은 대답이라고 생각합니다.
Simon Forsberg

@SimonForsberg 감사 합니다 .
Hi-Angel

17

그럼에도 불구하고 줄 바꿈 문자를 다음과 같이 제거 할 수 있습니다 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
    
  2. truncate -s -1 file

    부터 man truncate:

    -s, --size=SIZE
              set or adjust the file size by SIZE
    

    SIZE is an integer and optional unit (example: 10M is 10*1024*1024).
    Units are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).
    
    SIZE  may  also be prefixed by one of the following modifying characters: 
    '+' extend by, '-' reduce by, '<' at most, '>' at least, '/' round down to multiple of, '%' round up to multiple of.
    

이다 head -c -1 file | tee file안전? 하지 않을까요 tee시작하기 전에 파일을 잘라?
iruvar

1
@ 1_CR 그렇습니다. 파이프의 양면은 동시에 시작됩니다. 레이스에서이기는 사람의 문제입니다. 때문에 tee단지는 반면, 파일을 열 수있다 head읽고 그 내용을 쓸 수있다, tee실제로는 매우 작은 파일 때로는 제외하고 경주에서 이길 것입니다.
질 'SO-정지 존재 악마'

2
이것은 마지막 개행을 제거하지 않고 모든 개행을 제거합니다. IMO는 큰 차이가 있습니다.
Hi-Angel

8

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

perl -pi -e 'chomp if eof' myfile

비교 truncate또는 dd경우이 깨진 파일과 함께 당신을 떠나지 않을거야 myfile실제로 더 뒤에 줄 바꿈을했다.

(대답은 의견 에서 구성 되며이 답변을 기반으로 합니다 )


고맙습니다! 이 조건부 제거 방법은 개행 문자 뒤에 있습니다.
xer0x

2

다음은 한 가지 방법 입니다. 파일 sed의 마지막 ( $) 행에서 무엇이든 검색하고 모든 항목 ( .*)을 "일치하는 항목"과 "및 Linux"로 바꿉니다.

sed '$s/\(.*\)/\1 and Linux/' file

Isaac이 제공하는 훨씬 간단한 솔루션 은 다음과 같습니다.

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

이것은 (기호) 줄 끝을 주어진 텍스트로 바꿉니다.


아이작, 나는 그 제안을 좋아한다! 더 간단하고 분명합니다. 답변을 업데이트하겠습니다. 고맙습니다!
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.