Programing

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

crosscheck 2020. 5. 15. 20:53
반응형

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


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

파일 내용

some text at the beginning

결과

<added text> some text at the beginning

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

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


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,}

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

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

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

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

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

바로 편집 할 수 있습니다.


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

sed '1i\\'

당신이 사용할 수있는 cat -

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

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


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

/mnt/Vancouver/Programming/file1

상단의 태그 file1와를 Programming.

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

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

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

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

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

sed명령은 빈 파일에서 실패합니다. 다음은 https://superuser.com/questions/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 및 파일을 임시로 가져와야합니다. http://www.linfo.org/cat 의 맨 아래에있는 설명도 참조하십시오 . .html .

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

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

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

Note also that this will break over paths with spaces; there are solutions, elsewhere (e.g. file globbing, or find . -type f ... -type solutions) for those.

ADDENDUM: Re: my last comment, this script will allow you to recurse over directories with spaces in the paths:

#!/bin/bash

## https://stackoverflow.com/questions/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/"

# https://superuser.com/questions/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

There is a very easy way:

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

Hi with carriage return:

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

To add a line to the top of the file:

sed -i '1iText to add\'

my two cents:

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

This will work even is the string containing forward slash "/"


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

The first tac pipes the file backwards (last line first) so the "text to insert" appears last. The 2nd tac wraps it once again so the inserted line is at the beginning and the original file is in its original order.


Just for fun, here is a solution using ed which does not have the problem of not working on an empty file. You can put it into a shell script just like any other answer to this question.

ed Test <<EOF
a

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

The above script adds the text to insert to the first line, and then joins the first and second line. To avoid ed exiting on error with an invalid join, it first creates a blank line at the end of the file and remove it later if it still exists.

Limitations: This script does not work if <added text> is exactly equal to a single period.


Use subshell:

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

참고URL : https://stackoverflow.com/questions/9533679/how-to-insert-a-text-at-the-beginning-of-a-file

반응형