문제의파일에 여러 줄을 추가하는 방법OP는 셸 내의 파일에 여러 줄을 추가하는 방법을 찾고 있습니다. 해결책:
cat <<EOT >> test.txt
line 1
line 2
EOT
앞에 줄을 추가하고 싶습니다. 내 시도는 다음과 같습니다.
echo 3 >test.text
cat test.text <<EOT >> test.text
1
2
EOT
그러나 이로 인해 오류가 발생합니다.
cat: test.text: input file is output file
편집하다: 명확히 하기 위해 구성 파일을 수동으로 편집하는 방법에 대한 지침이 포함된 긴 서버 설정 가이드를 따르고 있습니다. 편집 작업에는 파일에 텍스트 블록을 추가하는 작업이 포함되는 경우도 있습니다. 특정 단계를 자동화할 때 가이드의 텍스트를 있는 그대로 복사하고 bash 한 줄에 넣어서 명령의 자세한 내용을 유지하고 싶습니다. 따라서 EOT
여러 줄의 텍스트 입력이 선호됩니다.
편집하다:sed를 사용하는 다른 답변은 각 줄 끝에 백슬래시를 추가하도록 요청하지만 수정하지 않고 여러 줄을 입력하고 싶습니다.
위와 비슷한 방식으로 파일 앞에 여러 줄을 추가하는 방법이 있습니까(이상적으로는 임시 파일 및 설치 없이 moreutils
)?
답변1
가장 안전한 방법은 원본 파일을 임시 위치에 복사하고 새 내용을 이전 이름의 파일과 연결하는 것입니다.
tmpfile=$(mktemp)
cp myfile "$tmpfile" &&
cat - "$tmpfile" <<NEW_CONTENTS >myfile
this is
new contents
at top of file
NEW_CONTENTS
rm "$tmpfile"
cat
명령 자체는 다음과 같습니다 .거의당신과 똑같습니다
cat myfile <<EOT >>myfile
1
2
3
EOT
그러나 cat
파일 이름 피연산자 중 하나가 이면 표준 입력을 읽도록 지시해야 합니다 -
. 또한 원본 파일에서 리디렉션한 다음 결과를 동일한 파일에 추가할 수 없습니다. 이렇게 하면 파일이 파티션의 모든 공간을 채울 때까지 계속 커지는 루프가 생성되기 때문입니다. 그래서 먼저 파일을 임시 파일에 복사한 다음 이를 사용하여 이전 이름에 대한 새 콘텐츠를 만들었습니다.
우리도 이걸 할 수 있어
tmpfile=$(mktemp)
cat - myfile <<NEW_CONTENTS >"$tmpfile" &&
this is
new contents
at top of file
NEW_CONTENTS
mv "$tmpfile" myfile
즉, 결과를 임시 파일에 쓴 다음 이를 이동하여 원본 파일을 대체합니다. 그러나 이러한 일련의 작업은 소유권 및 권한 유지를 보장하지 않습니다 myfile
.
표준 입력을 받아 주어진 파일 이름의 맨 위에 배치하는 작은 쉘 함수:
paste_header () {
local tmpfile=$(mktemp)
trap "rm -f '$tmpfile'" EXIT
cat - "$1" >"$tmpfile" &&
cat "$tmpfile" >"$1"
}
예를 들어 이러한 쓰기 방법을 사용하면 사용자는 클립보드의 내용을 대화식으로 붙여넣을 수 있지만 입력이 중단된 경우 원본 파일을 수정하지 않습니다 Ctrl+C. Ctrl+D(보내기 EOT
, 즉 텍스트 끝)을 눌러 대화형 입력을 종료해야 합니다 .
이 기능은 다음과 같이 사용됩니다.
paste_header filename
추가하려는 데이터를 대화형으로 붙여넣습니다 filename
(입력을 종료하기 위해 Ctrl+D).
또는
paste_header filename <otherfile
다른 파일의 데이터를 삽입합니다.
답변2
명령의 출력을 읽어야 하는 경우 ed
연결된 질문의 방법을 다음 변형과 함께 사용할 수 있습니다.
ed -s test.txt <<< $'0r !echo stuff\nw\nq'
이것은 0행 뒤에 r
명령의 출력을 echo stuff
기록합니다 .test.txt
here-doc를 통해 첫 번째 줄 앞에 여러 줄의 텍스트를 삽입하려면 다음을 실행해야 합니다.
ed -s test.txt <<EOT
1i
add some line
and some more
to the beginning
.
w
q
EOT
점은 입력 패턴의 끝을 나타냅니다. 즉, 마지막 솔루션에서는 텍스트에 단일 점으로 구성된 선이 포함되어 있지 않다고 가정합니다.
답변3
평범한 것을 사용할 수 있습니다전직 텍스트 편집자거의 모든 POSIX 호환 시스템에서 사용할 수 있습니다.
첫 번째 행을 삽입하려면 다음을 수행하십시오.
ex -sc '1i|new first line' -cx test.txt
여러 행을 추가하려는 경우 루프에 행을 추가하고 맨 위에 있는 요소를 맨 끝에 추가하면 됩니다(스택처럼).
for number in 5 4 3 2 1; do
ex -sc '1i|'"$number"'' -cx newfile
done
파일에 여러 번 쓰는 것을 피하려면 여러 줄 내용에서 변수를 구성하고 직접 삽입하십시오.
multiple_lines=$'line1\nline2\nline3\nline4\nline5\n'
ex -sc '1i|'"$multiple_lines"'' -cx newfile
답변4
sed를 사용하세요:
$ sed -e 'i1' -e 'i2' test.text
1
2
3