sed를 사용하여 파일 시작 부분에 TeX 매크로 추가(내 방법이 작동하지 않는 이유는 무엇입니까?)

sed를 사용하여 파일 시작 부분에 TeX 매크로 추가(내 방법이 작동하지 않는 이유는 무엇입니까?)

파일 시작 부분에 줄을 추가해야 합니다. 문제의 라인은

\def\submit{}

제가 사용하는 반작업 솔루션이 있습니다 sed. 모르겠지만 sed온라인 어딘가에서 얻었지만 줄 시작 부분에 원하지 않는 공백을 삽입하기 때문에 작동하지 않습니다. 별로 상관은 없지만 제대로 하는 게 좋을 것 같아요.

sed -i '1i\ \\\def\\\submit{}' 'dirname/filename'

내가 읽은 바에 따르면 쉘을 탈출하려면 추가 백슬래시가 모두 필요한 것 같습니다. 다른 솔루션도 환영하지만 가능하다면 상대적으로 컴팩트한 라이너를 원합니다. 감사해요.

이 문제,Linux에서 터미널을 통해 sed를 사용하여 파일 시작 부분에 텍스트 삽입비슷하지만 내 표현을 디버깅하는 데 도움이 되지 않습니다.

편집: 이전 접근 방식의 문제점을 설명하기 때문에 @Jonathan의 답변을 수락했습니다. 그러나 답변도 추가했습니다.

답변1

sed스트림 편집에 사용됩니다. 파일은 스트림이 아닙니다. ed또는 와 같이 이러한 목적으로 설계된 프로그램을 사용하십시오 ex. 이 -i옵션은 sed이식할 수 없을 뿐만 아니라 실제로 파일을 삭제하고 다시 생성하므로 파일에 대한 모든 심볼릭 링크도 끊어집니다. 이는 의미가 없습니다.

ed -s [file] << EOF
0a
\\def\\submit{}
.
w
EOF

답변2

지금은 sed에 액세스할 수 없기 때문에 이것이 올바른지 완전히 확신할 수는 없지만 첫 번째 백슬래시와 그 뒤의 공백만 제거하면 된다고 생각합니다.

sed -i '1i\\\def\\\submit{}' 'dirname/filename'

그것을 시도하고 그것이 작동하는지 확인하십시오.

답변3

나는 그것을 사용하여 그것의 작업 버전을 얻을 수있었습니다답변: "여러 파일의 시작 부분에 태그를 추가하는 방법은 무엇입니까?".

이전에는 이 문제에 대해 몰랐습니다. 해결책은 다음과 같습니다.

sed -i '1s/^/\\\def\\\submit{}\n/' 'dirname/filename'

그런데 저는 "여러 파일의 시작 부분에 태그를 추가하는 방법"이 이 질문에 연결되는 "Linux 터미널을 통해 sed를 사용하여 파일 시작 부분에 텍스트 삽입"보다 더 나은 참조 질문이라고 생각했습니다. 또한 많은 답변이 있습니다.

답변4

첫째: 백슬래시를 이스케이프하는 것은 쉘 때문이 아닙니다. 문자열은 작은따옴표로 묶여 있습니다. 그러나 그 자체 때문입니다 sed.

둘째: Chris Tang의 답변에는 장점이 있습니다. 드라이버 대신 망치를 사용하지 마십시오. 반면에 이식성과 심볼릭 링크가 항상 문제가 되는 것은 아니며, 그렇다면 둘 다 문제가 됩니다.

sed '1i\\\def\\submit{}'

그리고

sed '1i\\def\submit{}\'

필요한 일을 해야 합니다. 후자 형식의 후행 백슬래시가 문자열에서 이스케이프 기능을 끄는 이유를 알 수 없지만 적어도 sed명령이 명령줄에 배치될 때 GNU에서는 그런 식으로 작동하는 것 같습니다. 스크립트에서 사용할 경우 첫 번째 형식만 작동하는 것처럼 보입니다(후행 백슬래시가 줄의 끝을 나타내는 데 사용되고 그 뒤에 또 다른 백슬래시가 오기 때문입니다).

#!/bin/sed -f 
1i\
\\def\\submit{}              

관련 정보