Bash - 전체 내용을 읽지 않고 텍스트 파일의 시작 부분에 문자열을 추가하는 방법은 무엇입니까?

Bash - 전체 내용을 읽지 않고 텍스트 파일의 시작 부분에 문자열을 추가하는 방법은 무엇입니까?

"test.txt"라는 텍스트 파일 앞에 "hello world"라는 문자열을 삽입하려고 합니다. 이 작업을 수행하기 위해 sed를 사용했지만 불행하게도 "sed 명령"이 전체 파일을 읽을 때 메모리를 죽였습니다.

내 파일에는 1GB의 텍스트가 포함되어 있고 메모리는 512MB밖에 없습니다. 어떻게 해야 합니까? ,이와 같이:

echo --insert-before "hello world" >> test.txt

아니면 다음과 같이 삽입하려면 어떤 연산자를 사용해야 합니까?

echo "hello world" << test.txt

아니면 다른 아이디어인가요?

참고: 끝에 텍스트를 삽입하는 연산자는 >>잘 작동합니다. 메모리가 소모되지는 않지만 새 줄 없이 텍스트 파일의 내용을 덮어쓰지 않고 파일 시작 부분에서 역순으로 수행해야 합니다.

제가 사용하는 실제 코드는 다음과 같습니다.

echo "hello world" > test.txt;
echo "the large content that size is 1gb" >> test.txt;
sed -i ':a;N;$!ba;s/\n//g' test.txt;

답변1

사용하는 명령의 순서는 다음과 같습니다.

echo "hello world" > test.txt;
echo "the large content that size is 1gb" >> test.txt;
sed -i ':a;N;$!ba;s/\n//g' test.txt;

나는 이 명령이 실제로 다음과 같다고 가정합니다.

echo "hello world" > newfile;
cat test.txt >> newfile;            # assuming the file with 1GigaByte was test.txt

설명에서 줄 바꿈을 제거하는 데만 사용되는 sed 명령에 대해 불평합니다.

tr(너무 많은) 메모리를 사용하지 않고도 동일한 작업을 수행할 수 있습니다.

echo "hello world" > newfile;
cat test.txt | tr -d '\n' >> newfile

newfile"hello world"가 앞에 붙은 test.txt 사본이 있을 것입니다 .

답변2

sed메모리를 너무 많이 사용하지 않습니다. 그러나 운영 체제가 디스크를 캐싱하고 있을 수 있습니다. 따라서 를 사용하면 nocache도움이 될 수 있습니다(디스크가 충분히 빠르거나 동일한 데이터를 여러 번 읽지 않는 경우). 및/또는 --unbuffered옵션을 사용합니다 sed( sed종속성이 가능한 한 적은 메모리를 사용하도록).

또한 에코 옵션이 있을 수 없습니다. 이는 >>명령이 아닌 쉘에 의해 수행됩니다. 이는 명령의 표준 출력을 파일에 추가하도록 쉘에 지시합니다.

@Kusalananda가 말했듯이 sed스크립트는 효율적이지 않습니다. 아마 고양이만 사용할 것 같아요.

uncache cat "<(echo the_prefix)" old_file_name > new_file_name
rm old_file_name
mv -T new_file_name old_file_name #note not all `mv`s have the `-T` option, it can unsafely be left out.

답변3

좀 더 간단한 건 어때요?

cat <<_eof_ > file
Hello world!
$(cat file)
_eof_

아니면 에드를 사용하세요

echo '0a
your text here
.
w' | ed some_file

답변4

이것이 당신의 기억을 죽이고 있다면:

sed -i ':a;N;$!ba;s/\n//g' "test.txt"

그런 다음 개행 문자를 제거하고 한 번에 하나씩만 읽으려면 다음을 시도하십시오.

{
    printf "hello world"  # with no newline
    while IFS= read -r line || [ -n "$line" ]; do
        printf "%s" "$line"
    done < test.txt
    echo ""          # add a newline to the end of the file
} > test.txt.tmp && mv test.txt{.tmp,}

일반적인 상황에서는 sed보다 약간 느리지만 상황이 특이합니다.

관련 정보