IT

파일의 시작 부분에 텍스트를 삽입하는 방법은 무엇입니까?

itgroup 2023. 5. 28. 20:35
반응형

파일의 시작 부분에 텍스트를 삽입하는 방법은 무엇입니까?

지금까지 파일의 시작 부분에 줄을 추가하는 방법을 찾을 수 있었지만 제가 원하는 것은 아닙니다.예를 들어 설명하겠습니다.

파일 내용

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

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

$ { 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

내부 편집을 수행합니다.

하위 셸 사용:

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

안타깝게도 명령 대체는 파일 끝에서 새 행을 제거합니다.유지하기 위해 다음을 사용할 수 있습니다.

echo -n "hello" | cat - filename > /tmp/filename.tmp
mv /tmp/filename.tmp filename

그룹화나 명령 대체는 필요하지 않습니다.

새 줄만 삽입하기

sed '1i\\'

사용할 수 있습니다.cat -

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

파일의 맨 위에 줄을 추가하는 방법

sed -i '1iText to add\'

제 2센트입니다.

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

은 슬래시 가 열 이 작 합 니 다 동"/"

안녕하세요, 캐리지 리턴:

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

에서는 OS X 서는sed -i <pattern> file확장자를 에는 백업 확장자를 제공합니다.sed -i old <pattern> file,그리고나서file 수정되는 동안 제자리에서 됩니다.file.old생성됩니다.그런 다음 삭제할 수 있습니다.file.old당신의 대본에서.

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

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

문제: 파일의 맨 위에 있는 파일에 상위 디렉터리의 기본 이름을 태그합니다.

즉, 때문에

/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>

로 고는 다음과 .-in cat 명령어가 필요합니다(표준 입력이 필요한 경우: 참조).man cat자세한 내용은)을 참조하십시오.여기, 제 생각에는 printf 문(STDIN으로)의 출력물을 가져와, 그것과 파일을 임시로...http://www.linfo.org/cat.html 하단의 설명도 참조하십시오.

저는 또한 추가했습니다.-f에▁mv명령을 사용하여 파일을 덮어쓸 때 확인 메시지가 표시되지 않도록 합니다.

디렉터리를 다시 검색하려면:

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

이는 합니다. 파일 글로빙 또한이공있경돌것입다는로니파를간할이은것,▁with▁notee). 다른 곳에 해결책이 있습니다(예: 파일 글로빙 또는find . -type f ...solution)은.-type의 입니다.

부록:Re: 마지막 설명입니다. 이 스크립트를 사용하면 경로에 공백이 있는 디렉터리를 다시 검색할 수 있습니다.

#!/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

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

ed Test <<EOF
a

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

위의 스크립트는 삽입할 텍스트를 첫 번째 줄에 추가한 다음 첫 번째 줄과 두 번째 줄에 결합합니다.잘못된 조인으로 인해 오류가 발생할 경우 종료되지 않도록 하려면 먼저 파일 끝에 빈 줄을 작성하고 파일이 여전히 존재하는 경우 나중에 제거합니다.

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

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

번째 첫째번째.tac삽입할 마지막에 을 역방향 줄 으로 파이프합니다."삽입할 텍스트"가 마지막에 나타나도록 파일을 뒤로 파이프합니다(마지막 줄 먼저). 제2회tac삽입된 줄이 처음에 있고 원본 파일이 원래 순서대로 있도록 다시 한 번 래핑합니다.

제가 찾은 가장 간단한 해결책은 다음과 같습니다.

echo -n "<text to add>" | cat - myFile.txt | tee myFile.txt

주의:

  • 제다한을 합니다.| tee myFile.txt파일 내용을 변경하지 않으려는 경우
  • 를 합니다.-n전체 줄을 추가하려면 매개 변수를 선택합니다.
  • 더하다&> /dev/null출력(생성된 파일)을 표시하지 않으려면 끝까지 표시합니다.
  • 파일에 셰방을 추가하는 데 사용할 수 있습니다. 예:
    # make it executable (use u+x to allow only current user)
    chmod +x cropImage.ts
    # append the shebang
    echo '#''!'/usr/bin/env ts-node | cat - cropImage.ts | tee cropImage.ts &> /dev/null
    # execute it
    ./cropImage.ts myImage.png
    

별칭이 있는 다른 솔루션입니다.initrc/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"

echo접근, 만약 당신이 나처럼 macOS/BSD를 사용하고 있다면, 그것을 잃으세요.-n다른 사람들이 제안하는 전환.그리고 저는 텍스트에 대한 변수를 정의하는 것을 좋아합니다.

따라서 다음과 같습니다.

Header="my complex header that may have difficult chars \"like these quotes\" and line breaks \n\n "

{ echo "$Header"; cat "old.txt"; } > "new.txt"
mv new.txt old.txt

TL;dr -

사을고려다니합을 사용하는 것을 .ex줄의 에, 으로 여러분이 수 .sed그러나 "장소 편집" 옵션은 기본 제공됩니다.

나는 당신이 있는 환경을 상상할 수 없습니다.sed하지만 아닙니다.ex/viMS Windows 박스에 특별한 "sed.exe"가 있는 것이 아니라면, 아마도.

sed&grep에서 진화한 것 같은.ex/vi그래서 말하는 것이 더 나을 수도 있습니다.sed은 구이다같습다니음과 .ex.

라인 번호를 #1 이외의 번호로 변경하거나 라인을 검색하여 변경할 수 있습니다.

source=myFile.txt
Front="This goes IN FRONT "
man true > $source
ex -s ${source} <<EOF
1s/^/$Front/ 
wq
EOF
$ head -n 3 $source
This goes IN FRONT TRUE(1)                                                    User Commands                                                    TRUE(1)

NAME

버전,는 긴버전추천다니합을다.ex(또는)ed당신이 멋진 아이들 중 한 명이라면).

좋아해요ex휴대성이 뛰어나고 매우 강력하며 GNU(또는 BSD) 확장 없이도 모든 데이터를 인플레이스(in-place)로 작성하거나 백업할 수 있기 때문입니다.

만약 이 또한을 , 만당이알있다면고신약있▁addition면다▁the▁if알고.ex방법, 그러면 당신은 그것을 어떻게 하는지 압니다.vi 아마도 리고아마그아.vim그게 당신의 잼이라면.:EOF는 "하고 "i"를 할 때 로 묶이지 .echo:

str="+++ TOP +++" && ex -s <<EOF
r!man true
1i
`echo "$str"`
.
"0r!echo "${str}"
wq! true.txt
EOF

0r!echo "${str}"의 약어로도 사용될 수 있습니다.:0read!또는:0r!에 했을 가능성이 것.vi모드(말 그대로 동일한 것) 하지만:여기서는 옵션이며 일부 구현에서는 0의 "r" 읽기 주소를 지원하지 않습니다.특수 행 #0(또는 행 1)으로 직접 "r"을 읽는 것은 자동으로 모든 것을 "아래"로 밀어넣을 것이고, 그러면 당신은 그냥:wq변경 내용을 저장합니다.

$ head -n 3 true.txt | nl -ba   
     1  +++ TOP +++
     2  TRUE(1)                          User Commands                         TRUE(1)
     3  

고전적인 한가고인적전장또▁also인적고.sed예:\U&저) 그일그ex기본값으로 설정해야 합니다.

cat여러 파일을 연결합니다. <()명령의 출력을 파일로 보냅니다. 가지를 하면, 에 " 를 결 하 면 다 같 있 수 니 습 삽 할 입 줄 을 이 과 끝 에 과 합 음 처파 의 일 , 다 ▁combining ▁lines ▁at ▁insert 니

cat <(echo "line before the file") file.txt <(echo "line after the file")

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

반응형