Programing

유닉스에서 파일의 마지막 문자를 제거하려면 어떻게해야합니까?

crosscheck 2021. 1. 6. 20:19
반응형

유닉스에서 파일의 마지막 문자를 제거하려면 어떻게해야합니까?


임의의 여러 줄 텍스트 파일이 있다고 가정합니다.

sometext
moretext
lastline

텍스트 파일을 무효화하지 않고 파일의 마지막 문자 (개행 문자 나 널이 아닌 e) 만 제거하려면 어떻게해야합니까?


더 간단한 접근 방식 ( 출력은 stdout , 입력 파일을 업데이트하지 않음) :

sed '$ s/.$//' somefile
  • $마지막 입력 행과 만 일치하는 Sed 주소이므로 다음 함수 호출 ( s/.$//)이 마지막 행에서만 실행됩니다.
  • s/.$//줄의 마지막 문자 (이 경우 last )를 빈 문자열로 바꿉니다 . 즉, 마지막 문자를 효과적으로 제거합니다. (줄 바꿈 앞) 줄에.
    .행의 모든 ​​문자와 $일치하고 그 뒤에는 행의 끝에 일치하는 앵커가 있습니다. $정규식 에서 의 사용 이 개념적으로는 어떻게 관련되어 있지만 이전 $에 Sed 주소사용 된 것과는 기술적으로 구별됩니다 .
  • stdin 입력의 예 (Bash, Ksh 또는 Zsh로 가정) :

    $ sed '$ s/.$//' <<< $'line one\nline two'
    line one
    line tw
    

입력 파일업데이트 하려면 (입력 파일이 심볼릭 링크 인 경우 사용하지 마십시오) :

sed -i '$ s/.$//' somefile

참고 :
* OSX에서는 ; -i ''대신 을 사용해야 합니다 -i. 관련된 함정에 대한 개요는 여기 내 대답-i 의 아래쪽 절반을 참조 하십시오 .
당신이 매우 큰 입력 파일 및 / 또는 성능 / 디스크 사용량을 처리해야하는 경우 *는 우려 당신이 사용하고있는 GNU의 유틸리티 (리눅스)를 참조 sorontar의 도움이 대답 .


truncate

truncate -s-1 file

동일한 파일의 끝에서 한 (-1) 문자를 제거합니다. 정확히 >>같은 파일에 추가됩니다.

이 접근 방식의 문제점은 존재하는 경우 후행 개행을 유지하지 않는다는 것입니다.

해결책은 다음과 같습니다.

if     [ -n "$(tail -c1 file)" ]    # if the file has not a trailing new line.
then
       truncate -s-1 file           # remove one char as the question request.
else
       truncate -s-2 file           # remove the last two characters
       echo "" >> file              # add the trailing new line back
fi

tail이 문자가 아닌 마지막 바이트를 사용하기 때문에 작동합니다.

대용량 파일도 거의 시간이 걸리지 않습니다.

왜 안돼 sed

다음과 같은 sed 솔루션의 문제 sed '$ s/.$//' file는 전체 파일을 먼저 읽은 다음 (큰 파일의 경우 오랜 시간이 소요됨) 임시 파일 (원본과 동일한 크기)이 필요하다는 것입니다.

sed '$ s/.$//' file  > tempfile
rm file; mv tempfile file

그런 다음 임시 파일을 이동하여 파일을 바꿉니다.


다음 ex은 sed 솔루션만큼 비밀스럽지 않은 다른 사용 방법입니다.

 printf '%s\n' '$' 's/.$//' wq | ex somefile

$(가), 마지막 줄로 이동 s마지막 문자를 삭제하고, wq잘 알려진 (VI 사용자에게) 쓰기 + 종료합니다.


목표가 마지막 줄의 마지막 문자를 제거하는 것이라면 다음 awk을 수행해야합니다.

awk '{a[NR]=$0} END {for (i=1;i<NR;i++) print a[i];sub(/.$/,"",a[NR]);print a[NR]}' file
sometext
moretext
lastlin

모든 데이터를 배열에 저장 한 다음 인쇄하고 마지막 줄을 변경합니다.


다양한 전략을 가지고 놀면서 sed -i 또는 perl을 피한 후, 이것을 수행하는 가장 좋은 방법은 다음과 같습니다.

sed '$! { P; D; }; s/.$//' somefile

편집 된 답변

I created a script and put your text inside on my Desktop. this test file is saved as "old_file.txt"

sometext
moretext
lastline

Afterwards I wrote a small script to take the old file and eliminate the last character in the last line

#!/bin/bash
no_of_new_line_characters=`wc  '/root/Desktop/old_file.txt'|cut -d ' ' -f2`
let "no_of_lines=no_of_new_line_characters+1"
sed -n 1,"$no_of_new_line_characters"p  '/root/Desktop/old_file.txt' > '/root/Desktop/my_new_file'
sed -n "$no_of_lines","$no_of_lines"p '/root/Desktop/old_file.txt'|sed 's/.$//g' >> '/root/Desktop/my_new_file'

opening the new_file I created, showed the output as follows:

sometext
moretext
lastlin

I apologize for my previous answer (wasn't reading carefully)


Just a remark: sed will temporarily remove the file. So if you are tailing the file, you'll get a "No such file or directory" warning until you reissue the tail command.


sed 's/.$//' filename | tee newFilename

This should do your job.

ReferenceURL : https://stackoverflow.com/questions/27305177/how-can-i-remove-the-last-character-of-a-file-in-unix

반응형