`sed '$d' file`이 마지막 줄을 삭제하지 않는 이유는 무엇입니까?

`sed '$d' file`이 마지막 줄을 삭제하지 않는 이유는 무엇입니까?

문제 진단은 어디서부터 시작해야 합니까?

어디서부터 시작해야 할지조차 모르겠습니다. 문자열 및 파일 랭글링을 연습하고 있지만 파일의 마지막 줄을 제거할 수 없습니다 sed '$d' file.sh. 또한 sudo를 사용해 보았습니다(이 역시 작동하지 않았습니다).

내 소식통에 따르면 내 주문이 효과가 있을 것이라고 합니다.

cat, 및 같은 tail것을 사용하여 인쇄할 수 있다는 것을 알고 head -n -1있으며 이를 사용하여 삭제할 수 있어야 한다는 것도 읽었지만 제가 찾은 유일한 신뢰할 수 있는 소스는 문자 그대로 줄을 삭제하는 것입니다.https://linuxhint.com/sed-command-to-delete-a-line/위에 표시된 명령을 사용하라는 메시지가 표시됩니다.그것은 작동하지 않습니다.

최선의 추측?

-i이 명령이 파일의 마지막 줄을 성공적으로 삭제했음을 확인했습니다 . -i는 작동하지만 -i가 없으면 왜 작동하지 않습니까? -i를 포함하지 않으면 뒤에서 무슨 일이 발생합니까? 하드 드라이브가 손상됩니까?

답변1

sed(1970년대의 명령)은 s스트림 editor이며 파일을 편집하기 위한 것이 아닙니다. 파일 텍스트 편집기에 대해서는 ed, , 를 참조하십시오 ex.vi

sed표준 입력 또는 파일 내용(무언가가 인수로 전달된 경우)에서 입력 스트림을 가져오고, 주소와 일치하는 각 줄에 스크립트의 명령을 적용하여 동적으로 처리하고, sed필터링된 결과를 표준 출력에 인쇄합니다.

따라서 sed '$d'카딩/삭제된 마지막 줄( )을 제외한 모든 입력이 인쇄됩니다.$dd

> newfile해당 출력을 다른 명령(예: 공백 압착)에 추가하거나 파이프하여 | tr -s '[:blank:]' ' '파일에 저장할 수 있습니다 .

perl-p(80년대 중반 이후) 처럼 보이게 만드는 옵션이 있습니다 sed. 결과가 기록되는 대신 파일의 새 복사본에 기록되도록 동작을 변경하는 perl옵션도 추가되었습니다 -i[.back](n-place의 경우 ). istdout으로 변환하고 선택적으로 접미사를 붙여 원본을 유지합니다 .back.

GNU와 FreeBSD 구현 모두 sed2000년대 초반에 유사한 기능을 추가했지만 백업이 필요하지 않은 경우 sed -i '$d' fileGNU와 sed -i '' '$d' fileFreeBSD라는 다른 구문을 사용합니다. sed -i.back '$d'둘 다에서 작동 sed -i .back '$d'하지만 FreeBSD에서만 작동합니다.

몇몇 다른 sed구현에서는 -i옵션을 추가합니다. 대부분은 GNU 방식이지만 전부는 아니며 어떤 경우에도 이것은 표준 옵션이 아닙니다.

sed유일한 스트림 편집기 앱은 아닙니다. cat, awk, paste, tr, nroff, eq, sort, join, cut... 같은 방식으로 작동하며 입력을 받아 출력을 생성합니다. 아이디어는 Unix 쉘 스크립트의 강점 중 하나인 특정 작업을 수행하기 위해 이들을 서로 연결하는 것입니다. 그 중 파일을 제자리에서 편집할 수 있는 사람은 거의 없습니다. awkaka의 GNU 구현에는 옵션이 gawk있습니다 -i in-place. sort호출할 수 있습니다 sort -o file file(출력 쓰기를 시작하기 전에 전체 입력을 읽어야 하며 이 경우 백업이 없기 때문에 그렇습니다).

관련 정보