파일의 시작 부분에 텍스트를 삽입하는 방법은 무엇입니까?
지금까지 파일의 시작 부분에 줄을 추가하는 방법을 찾을 수 있었지만 제가 원하는 것은 아닙니다.예를 들어 설명하겠습니다.
파일 내용
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
/vi
MS 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
'IT' 카테고리의 다른 글
WPF용 Visual Studio 디자이너를 수동으로 다시 로드하는 방법 (0) | 2023.05.28 |
---|---|
원격 저장소에서 기록 커밋 (0) | 2023.05.28 |
깃 저장소에 대한 명명 규칙이 있습니까? (0) | 2023.05.28 |
Bash 셸 스크립트에서 모든 인수 전파 (0) | 2023.05.28 |
"변경사항이 커밋을 위해 준비되지 않음"은 무엇을 의미합니까? (0) | 2023.05.28 |