파일의 마지막 n줄을 편집할 수 있는 명령이 있습니까? 줄 수가 다른 여러 파일이 있습니다. 하지만 각 파일의 마지막 n 줄을 수정하고 싶습니다. 목표는 마지막 n 줄의 쉼표를 세미콜론으로 바꾸는 것입니다. 하지만 마지막 n 줄에만 해당됩니다.
어떤 줄도 삭제하고 싶지 않고 각 파일의 마지막 n 줄에서 각 쉼표를 세미콜론으로 바꾸고 싶습니다.
sed 명령을 사용하면 마지막 줄을 이 명령으로 바꿀 수 있습니다. 여기에 설명된 대로: 파일의 마지막 텍스트 줄을 삭제하는 방법은 무엇입니까?
하지만 이렇게 하면 마지막 n줄이 아닌 마지막 줄만 수정할 수 있습니다.
답변1
마지막 n 줄의 쉼표를 세미콜론으로 바꾸려면 다음을 수행합니다 ed
.
n=3
ed -s input <<< '$-'$((n-1))$',$s/,/;/g\nwq'
분리하세요:
ed -s
= ed를 자동으로 실행합니다(마지막에 기록된 바이트를 보고하지 않음).'$-'
= 파일 끝에서 빼기 ($
)...$((n-1))
= n-1개 행...- (
$' ... '
= 쉘로부터 보호하기 위해 명령의 나머지 부분을 인용합니다) ,$s/,/;/g
= ... 파일 끝까지(,$
)까지 모든 쉼표를 검색하여 세미콜론으로 바꿉니다.\nwq
= 이전 명령을 종료한 다음 저장하고 종료합니다.
마지막 n 줄의 쉼표를 세미콜론으로 바꾸려면 다음을 수행합니다 sed
.
n=3
sed -i "$(( $(wc -l < input) - n + 1)),\$s/,/;/g" input
분할:
-i
=파일을 "제자리에서" 편집하세요$(( ... ))
= 수학을 좀 해보세요:$( wc -l < input)
= 파일의 줄 수를 가져옵니다.-n + 1
= n-1 줄 뒤로 이동,\$
= 라인 n-1부터 파일 끝까지:s/,/;/g
= 쉼표를 세미콜론으로 바꾸세요.
답변2
tac
및 다음 을 사용하여 sed
file.txt의 마지막 50줄에 있는 모든 쉼표를 세미콜론으로 바꾸는 솔루션 :
tac file.txt | sed '1,50s/,/;/g' | tac
답변3
GNU head
및 Bourne과 유사한 쉘 사용:
n=20
{ head -n -"$n"; tr , ';'; } < file 1<> file
파일 자체를 덮어쓰고 있습니다. 바이트 단위로 음역하는 경우에는 괜찮지만 1<> file
수정으로 인해 파일 크기가 변경되는 경우에는 반드시 그런 것은 아닙니다(예를 들어 로 바꿔야 하는 경우).> other-file && mv other-file file
답변4
tail
sed에 사용 하고 파이프:
tail -n 20 file | sed 's/,/;/g'
이는 파일의 마지막 20줄에 적용됩니다. 파일에 직접 액세스하려면 다음을 사용하세요.
tail -n 20 file | sed -i 's/,/;/g'