파일의 시작 부분에 텍스트를 삽입하는 방법?


213

지금까지 파일의 시작 부분에 줄을 추가하는 방법을 찾을 수 있었지만 정확히 내가 원하는 것은 아닙니다. 예제로 보여 드리겠습니다

파일 내용

some text at the beginning

결과

<added text> some text at the beginning

비슷하지만 새로운 줄을 만들고 싶지 않습니다 ...

sed가능한 경우이 작업을 수행하고 싶습니다 .


여기에 아무것도 당신을 위해 작동합니까? stackoverflow.com/questions/54365/…- 당신은 사용할 필요가 없습니다 sed.
wkl

답변:


314

sed 주소에서 작동 할 수 있습니다 :

$ sed -i '1s/^/<added text> /' file

1s여기 모든 대답 에서이 마법이 무엇입니까 ? 라인 어드레싱! .

<added text>처음 10 줄 을 추가 하고 싶 습니까?

$ sed -i '1,10s/^/<added text> /' file

또는 다음을 사용할 수 있습니다 Command Grouping.

$ { echo -n '<added text> '; cat file; } >file.new
$ mv file{.new,}

67
실제로 새 줄을 삽입하려면 : sed -i '1s / ^ / <added text> \ n /'파일
jslatts

1
왜 -i를 사용합니까 ?? 사람에게 그것은 접미사를위한 것이라고 말합니다. linux.die.net/man/1/sed
endrigoantonini

-i는 제자리를 나타내며 -i에 접미사를 추가하여 덮어 쓰기보다는 복사 할 수 있습니다. -i.new는 .new로 끝나는 새 파일을 만들지 만 -i는 파일을 직접 편집합니다.
Jay Kamat

3
sed는 빈 파일에서 작동하지 않습니다. sed는 길이가 0 인 입력으로 아무것도 수행 할 수 없습니다.
jthill

2
이 솔루션의 단점은 파일이 비어 있으면 텍스트를 추가하지 않는다는 것입니다.
DBedrenko

41

파일 시작 부분에 줄을 추가 \n하려면 위의 최상의 솔루션에서 문자열 끝에 줄 을 추가해야합니다 .

가장 좋은 해결책은 문자열을 추가하지만 문자열을 사용하면 파일 끝에 줄을 추가하지 않습니다.

sed -i '1s/^/your text\n/' file

27

파일이 한 줄이면 다음을 사용할 수 있습니다.

sed 's/^/insert this /' oldfile > newfile

한 줄 이상인 경우. 다음 중 하나 :

sed '1s/^/insert this /' oldfile > newfile
sed '1,1s/^/insert this /' oldfile > newfile

다양한 라인을 수행하는 방법을 알 수 있도록 후자를 포함 시켰습니다. 이 두 가지 모두 영향을받는 줄의 시작 줄 표식을 삽입하려는 텍스트로 "대체"합니다. 당신은 또한 (당신 sed이 충분히 현대적 이라고 가정 ) 사용할 수 있습니다 :

sed -i 'whatever command you choose' filename

바로 편집 할 수 있습니다.


11

당신이 사용할 수있는 cat -

printf '%s' "some text at the beginning" | cat - filename

6
이것은 텍스트와 파일 내용 만 출력하지만 파일을 전혀 수정하지는 않습니다.
Adaephon

그것은 좋은 해결책입니다. 왜 그것이 공감대를 얻지 못했는지 궁금합니다. 여기 내 좋은 선생님이 있습니다. 또한 왜 간단한 반향이 아닌 printf입니까?
ychaouche

1
@ychaouche-아마도 echo개행을 추가하는 것을 막을 수있는 이식 가능한 방법이 없기 때문에 아마도 ?
Toby Speight

> file명령 을 추가 하여 파일로 보내려고했는데 , 터미널에 스팸을 "some text at the beginning"
넣었

2
printf '%s' "some text" | cat - filename > tmpfile && mv tmpfile filename
luca

10

개행 만 삽입하려면 다음을 수행하십시오.

sed '1i\\'

8

서브 쉘 사용 :

echo "$(echo -n 'hello'; cat filename)" > filename

5

OS X에서는 sed -i <pattern> file에 실패합니다. 백업 확장을 제공하는 경우, sed -i old <pattern> file다음 file동안 장소에서 수정 file.old작성됩니다. 그런 다음 file.old스크립트에서 삭제할 수 있습니다 .


4
또는 sed -i ''파일입니다. 그런 다음 제자리에서 편집하고 백업하지는 않습니다.
Harv

macOS sed가 백업을 만들지 않고 편집 할 점을 원한다는 것을 알았습니다 .sed -i. <pattern> 파일
Bryan

4

문제 : 파일 상단에 파일을 부모 디렉토리의 기본 이름으로 태그하십시오.

/mnt/Vancouver/Programming/file1

상단의 태그 file1와를 Programming.

해결 방법 1- 비어 있지 않은 파일 :

bn=${PWD##*/}    ## bn: basename

sed -i '1s/^/'"$bn"'\n/' <file>

1s 텍스트를 파일의 1 행에 배치합니다.

해결 방법 2- 비어 있거나 비어 있지 않은 파일 :

sed위 의 명령은 빈 파일에서 실패합니다. 다음은 /superuser/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash/246841#246841을 기반으로 한 솔루션입니다.

printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>

있습니다 -고양이의 명령이 필요는 (표준 입력을 읽 참조 man cat자세한 내용). 여기에서 printf 문의 출력을 STDIN으로 가져 와서 cat 및 파일을 임시로 가져와야한다고 생각합니다 . .html .

또한 파일을 덮어 쓸 때 확인을 요청하지 않도록 명령에 추가 -f했습니다 mv.

디렉토리를 반복하려면 다음을 수행하십시오.

for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done

또한 공백이있는 경로를 깰 수 있습니다. 다른 곳에 솔루션 (예 : 파일 글 로빙 또는 find . -type f ...유형 솔루션)이 있습니다.

부록 : Re : 마지막 코멘트입니다.이 스크립트를 사용하면 경로에 공백이있는 디렉토리를 통해 재귀를 수행 할 수 있습니다.

#!/bin/bash

## /programming/4638874/how-to-loop-through-a-directory-recursively-to-delete-files-with-certain-extensi

## To allow spaces in filenames,
##   at the top of the script include: IFS=$'\n'; set -f
##   at the end of the script include: unset IFS; set +f

IFS=$'\n'; set -f

# ----------------------------------------------------------------------------
# SET PATHS:

IN="/mnt/Vancouver/Programming/data/claws-test/corpus test/"

# /superuser/716001/how-can-i-get-files-with-numeric-names-using-ls-command

# FILES=$(find $IN -type f -regex ".*/[0-9]*")        ## recursive; numeric filenames only
FILES=$(find $IN -type f -regex ".*/[0-9 ]*")         ## recursive; numeric filenames only (may include spaces)

# echo '$FILES:'                                      ## single-quoted, (literally) prints: $FILES:
# echo "$FILES"                                       ## double-quoted, prints path/, filename (one per line)

# ----------------------------------------------------------------------------
# MAIN LOOP:

for f in $FILES
do

  # Tag top of file with basename of current dir:
  printf "[top] Tag: ${PWD##*/}\n\n" | cat - $f > temp && mv -f temp $f

  # Tag bottom of file with basename of current dir:
  printf "\n[bottom] Tag: ${PWD##*/}\n" >> $f
done

unset IFS; set +f

3

캐리지 리턴으로 안녕 :

sed -i '1s/^/your text\n/' file

3

파일 맨 위에 줄을 추가하려면

sed -i '1iText to add\'

이것은 질문자가 명시 적으로 원하지 않는 개행을 포함합니다.
Toby Speight

필요한 것을 정확하게 알려 주셔서 감사합니다.
FindOutIslamNow

3

매우 쉬운 방법이 있습니다.

echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt

죄송합니다. 이제 새 줄이 아니라 처음에 추가하고 싶다는 것을 알게되었습니다.
라파엘 빌라 보아스

그러나 나는 새로운 줄을 원했습니다. 간단한 접근 방식에 감사드립니다.
TheSatinKnight

3

재미를 위해 여기 ed에 빈 파일로 작업하지 않는 문제가없는 솔루션이 있습니다. 이 질문에 대한 다른 답변과 마찬가지로 쉘 스크립트에 넣을 수 있습니다.

ed Test <<EOF
a

.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF

위의 스크립트는 첫 번째 줄에 삽입 할 텍스트를 추가 한 다음 첫 번째 줄과 두 번째 줄을 결합합니다. 잘못된 조인으로 오류가 발생하여 종료되는 것을 방지하기 위해 파일 끝에 빈 줄을 만들고 나중에 존재하는 경우 나중에 제거합니다.

제한 사항 : 이 스크립트는 <added text>단일 기간과 정확히 같은 경우 작동하지 않습니다 .


2

내 두 센트 :

sed  -i '1i /path/of/file.sh' filename

슬래시가 포함 된 문자열조차도 작동합니다. "/"


1
echo -n "text to insert " ;tac filename.txt| tac > newfilename.txt

첫 번째 tac는 파일을 뒤로 (마지막 줄 먼저) 파이프하므로 "삽입 할 텍스트"가 마지막에 나타납니다. 두 번째 tac줄은 다시 한 번 감싸서 삽입 된 줄이 시작 부분에 있고 원본 파일이 원래 순서대로되어 있습니다.


1
이것이 Tomas에 어떻게 도움이되는지 설명해 주시겠습니까?
John Odom 2016 년

전술 | 전술-그것은 확장 불가능한 사고 방식을 형성하는 방법입니다 :-(
Michael Shigorin

0

별명을 가진 또 다른 솔루션. init rc / env 파일에 추가하십시오 :

addtail () { find . -type f ! -path "./.git/*" -exec sh -c "echo $@ >> {}" \; }
addhead () { find . -type f ! -path "./.git/*" -exec sh -c  "sed -i '1s/^/$@\n/' {}" \; }

용법:

addtail "string to add at the beginning of file"
addtail "string to add at the end of file"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.