[shell] 하나의 라이너를 파일 앞에 추가

이것은 아마도 복잡한 해결책 일 것입니다 .

“>>”와 같은 간단한 연산자를 찾고 있지만 앞에 추가합니다.

그것이 존재하지 않을까 걱정됩니다. 나는 다음과 같은 일을해야 할 것이다.

 mv myfile tmp
 고양이 myheader tmp> myfile

더 똑똑한 것이 있습니까?



답변

아래 의 은 빠른 커프스 답변으로 많은 찬사를 받았습니다. 그런 다음 질문이 더 대중화되고 시간이 지남에 따라 분노한 사람들은 문제가 발생했지만 이상한 일이 발생하거나 전혀 작동하지 않았다고보고하기 시작했습니다. 이러한 재미.

이 솔루션은 시스템에서 파일 디스크립터의 정확한 구현을 활용하며, 구현은 nix마다 크게 다르기 때문에 성공은 전적으로 시스템에 따라 다르고 결정적으로 이식 할 수 없으며, 모호하게 중요한 것에 의존해서는 안됩니다.

이제, 그 모든 대답을 벗어난 대답은 다음과 같습니다.


파일에 대한 다른 파일 디스크립터를 exec 3<> yourfile작성하면 ( ) 파일에 쓰는 ( >&3) 동일한 파일 딜레마에 대한 읽기 / 쓰기를 극복하는 것으로 보입니다. awk가있는 600K 파일에서 작동합니다. 그러나 ‘cat’을 사용하여 동일한 트릭을 시도하면 실패합니다.

접두사를 awk ( -v TEXT="$text")에 변수로 전달하면 리터럴 따옴표 문제를 극복하여 ‘sed’로이 트릭을 수행하지 못하게합니다.

#!/bin/bash
text="Hello world
What's up?"

exec 3<> yourfile && awk -v TEXT="$text" 'BEGIN {print TEXT}{print}' yourfile >&3


답변

이것은 여전히 ​​임시 파일을 사용하지만 적어도 한 줄에 있습니다.

echo "text" | cat - yourfile > /tmp/out && mv /tmp/out yourfile

크레딧 : BASH : 파일 앞에 텍스트 / 줄 추가


답변

echo '0a
your text here
.
w' | ed some_file

ed는 표준 편집기입니다! http://www.gnu.org/fun/jokes/ed.msg.html


답변

John Mee : 메소드가 작동한다고 보장되지 않으며 4096 바이트 이상의 물건을 추가하면 실패 할 것입니다 (적어도 gnu awk에서 발생하는 일이지만 다른 구현에는 비슷한 제약 조건이 있다고 가정합니다). 이 경우에는 실패 할뿐만 아니라 자체 출력을 읽을 수있는 무한 루프로 들어가서 사용 가능한 모든 공간이 채워질 때까지 파일이 커집니다.

직접 해보십시오.

exec 3<>myfile && awk 'BEGIN{for(i=1;i<=1100;i++)print i}{print}' myfile >&3

(경고 : 잠시 후 죽이거나 파일 시스템을 채울 것입니다)

또한 파일을 그런 식으로 편집하는 것은 매우 위험하며 파일을 편집하는 동안 (충돌, 디스크 꽉 참) 어떤 일이 발생하는 경우 파일이 일관성이없는 상태로 유지되는 것이 거의 보장되므로 매우 나쁜 조언입니다.


답변

임시 파일이 없으면 불가능하지만 여기에는 oneliner가 있습니다.

{ echo foo; cat oldfile; } > newfile && mv newfile oldfile

ed 또는 perl과 같은 다른 도구를 사용하여 임시 파일없이 수행 할 수 있습니다.


답변

적어도 스크립트가 루트 권한으로 실행될 경우 mktemp 와 같은 유틸리티를 사용하여 임시 파일을 안전하게 생성 하는 것이 좋습니다 . 예를 들어 bash에서 다시 다음을 수행 할 수 있습니다.

(tmpfile=`mktemp` && { echo "prepended text" | cat - yourfile > $tmpfile && mv $tmpfile yourfile; } )


답변

제어하는 컴퓨터에서이 패키지가 필요한 경우 “moreutils”패키지를 설치하고 “sponge”을 사용하십시오. 그럼 당신은 할 수 있습니다 :

cat header myfile | sponge myfile