이 sed 구성이 빈 파일에 아무것도 삽입하지 않는 이유는 무엇입니까?

이 sed 구성이 빈 파일에 아무것도 삽입하지 않는 이유는 무엇입니까?

텍스트 파일의 첫 번째 줄에 콘텐츠를 삽입하기 위한 것으로 생각되는 이 구문을 발견했습니다 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작동합니다 .

awkGNU ( ) 가 없으면 gawk다음이 필요합니다.

awk 'BEGIN{print"hello world"} 1' foo >tmp && mv tmp foo

어떻게 작동하나요?

명령줄에서 파일이 시작되기 전에 BEGINFILE{print"hello world"}기록됩니다 hello world. 이는 파일이 비어 있는지 여부에 관계없이 발생합니다.

파일의 각 줄에 대해 1해당 줄을 인쇄하는 awk의 약어입니다.

GNU awk의 경우 -i inplacesed 와 동일합니다 -i.

답변2

을 정말로 사용하고 싶다면 sed다음을 수행할 수 있습니다.

$ echo "FPM" >> foo; sed -i -e '1i\hello world' -e '$ d' foo

foo이는 유무, 비어 있음 여부 에 관계없이 작동합니다.

첫 번째 명령은 ifexists 끝에 echo "FPM" >> foo"FPM" 줄(원하는 텍스트 가능)을 추가합니다 . 그렇지 않으면 "FPM" 줄을 만들어 .foofoofoofoo

두 번째 명령은 sed -i -e '1i\hello world' -e '$ d' foo첫 번째 줄 위에 "hello world"를 삽입한 foo다음 파일의 마지막 줄("FPM" 포함)을 삭제합니다.

관련 정보