파일에 여러 줄을 추가하는 방법

파일에 여러 줄을 추가하는 방법

문제의파일에 여러 줄을 추가하는 방법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

관련 정보