유닉스에서 파일의 마지막 문자를 제거하려면 어떻게해야합니까?
임의의 여러 줄 텍스트 파일이 있다고 가정합니다.
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
'Programing' 카테고리의 다른 글
FactoryBot : 동일한 객체를 여러 번 생성 (0) | 2021.01.06 |
---|---|
SQL Server의 지정된 날짜에서 요일 이름 가져 오기 (0) | 2021.01.06 |
npm이 작동하지 않습니다. 항상이 오류가 발생합니다.-> 오류 : 'are-we-there-yet'모듈을 찾을 수 없습니다. (0) | 2021.01.06 |
Column.isin을 목록과 함께 사용하는 방법? (0) | 2021.01.06 |
로그 항목 당 타임 스탬프가있는 log4j (0) | 2021.01.06 |