문제 진단은 어디서부터 시작해야 합니까?
어디서부터 시작해야 할지조차 모르겠습니다. 문자열 및 파일 랭글링을 연습하고 있지만 파일의 마지막 줄을 제거할 수 없습니다 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
스트림 ed
itor이며 파일을 편집하기 위한 것이 아닙니다. 파일 텍스트 편집기에 대해서는 ed
, , 를 참조하십시오 ex
.vi
sed
표준 입력 또는 파일 내용(무언가가 인수로 전달된 경우)에서 입력 스트림을 가져오고, 주소와 일치하는 각 줄에 스크립트의 명령을 적용하여 동적으로 처리하고, sed
필터링된 결과를 표준 출력에 인쇄합니다.
따라서 sed '$d'
카딩/삭제된 마지막 줄( )을 제외한 모든 입력이 인쇄됩니다.$
d
d
> newfile
해당 출력을 다른 명령(예: 공백 압착)에 추가하거나 파이프하여 | tr -s '[:blank:]' ' '
파일에 저장할 수 있습니다 .
perl
-p
(80년대 중반 이후) 처럼 보이게 만드는 옵션이 있습니다 sed
. 결과가 기록되는 대신 파일의 새 복사본에 기록되도록 동작을 변경하는 perl
옵션도 추가되었습니다 -i[.back]
(n-place의 경우 ). i
stdout으로 변환하고 선택적으로 접미사를 붙여 원본을 유지합니다 .back
.
GNU와 FreeBSD 구현 모두 sed
2000년대 초반에 유사한 기능을 추가했지만 백업이 필요하지 않은 경우 sed -i '$d' file
GNU와 sed -i '' '$d' file
FreeBSD라는 다른 구문을 사용합니다. sed -i.back '$d'
둘 다에서 작동 sed -i .back '$d'
하지만 FreeBSD에서만 작동합니다.
몇몇 다른 sed
구현에서는 -i
옵션을 추가합니다. 대부분은 GNU 방식이지만 전부는 아니며 어떤 경우에도 이것은 표준 옵션이 아닙니다.
sed
유일한 스트림 편집기 앱은 아닙니다. cat
, awk
, paste
, tr
, nroff
, eq
, sort
, join
, cut
... 같은 방식으로 작동하며 입력을 받아 출력을 생성합니다. 아이디어는 Unix 쉘 스크립트의 강점 중 하나인 특정 작업을 수행하기 위해 이들을 서로 연결하는 것입니다. 그 중 파일을 제자리에서 편집할 수 있는 사람은 거의 없습니다. awk
aka의 GNU 구현에는 옵션이 gawk
있습니다 -i in-place
. sort
호출할 수 있습니다 sort -o file file
(출력 쓰기를 시작하기 전에 전체 입력을 읽어야 하며 이 경우 백업이 없기 때문에 그렇습니다).