텍스트 파일의 첫 번째 줄에 콘텐츠를 삽입하기 위한 것으로 생각되는 이 구문을 발견했습니다 sed
. 하지만 파일에 기존 콘텐츠가 있는 경우에만 작동하는 것처럼 보이고 파일이 비어 있으면 아무 작업도 수행하지 않습니다. 왜? 기존 파일 내용에 관계없이 파일의 첫 번째 줄에 텍스트를 삽입하는 더 나은 구성은 무엇일까요?
$ rm -f ./foo
$ touch foo
$ sed -i "1 i\hello world" foo
$ cat ./foo
$ echo "whatever" >> ./foo
$ cat ./foo
whatever
$ sed -i "1 i\hello world" foo
$ cat ./foo
hello world
whatever
$
답변1
Sed는 파일의 각 라인에서 작동하지만 파일에 라인이 없으면 sed는 작동하지 않습니다. 일반적으로 awk는 더 많은 유연성을 제공합니다.
GNU를 사용해 보세요 awk
:
gawk -i inplace 'BEGINFILE{print"hello world"} 1' foo
위의 내용 은 비어 있는지 여부에 관계없이 foo
작동합니다 .
awk
GNU ( ) 가 없으면 gawk
다음이 필요합니다.
awk 'BEGIN{print"hello world"} 1' foo >tmp && mv tmp foo
어떻게 작동하나요?
명령줄에서 파일이 시작되기 전에 BEGINFILE{print"hello world"}
기록됩니다 hello world
. 이는 파일이 비어 있는지 여부에 관계없이 발생합니다.
파일의 각 줄에 대해 1
해당 줄을 인쇄하는 awk의 약어입니다.
GNU awk의 경우 -i inplace
sed 와 동일합니다 -i
.
답변2
을 정말로 사용하고 싶다면 sed
다음을 수행할 수 있습니다.
$ echo "FPM" >> foo; sed -i -e '1i\hello world' -e '$ d' foo
foo
이는 유무, 비어 있음 여부 에 관계없이 작동합니다.
첫 번째 명령은 ifexists 끝에 echo "FPM" >> foo
"FPM" 줄(원하는 텍스트 가능)을 추가합니다 . 그렇지 않으면 "FPM" 줄을 만들어 .foo
foo
foo
foo
두 번째 명령은 sed -i -e '1i\hello world' -e '$ d' foo
첫 번째 줄 위에 "hello world"를 삽입한 foo
다음 파일의 마지막 줄("FPM" 포함)을 삭제합니다.