Bash - 如何将字符串添加到文本文件的开头而不读取全部内容?

Bash - 如何将字符串添加到文本文件的开头而不读取全部内容?

我试图在名为“test.txt”的文本文件之前插入一个字符串“hello world”,我已经使用 sed 执行此操作,但不幸的是“sed 命令”杀死了我的记忆,因为它读取了整个文件。

我的文件包含 1GB 大小的文本,而我的内存只有 512 MB。我该怎么做?,像这样:

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有一份 test.txt 的副本,前面加上“hello world”。

答案2

sed不使用太多内存。但是操作系统可能正在缓存磁盘。因此使用nocache可能会有所帮助(如果磁盘足够快,或者您没有多次读取相同的数据)。和/或使用--unbuffered选项sed(以便sed依赖确实使用尽可能少的内存)。

另外,也不能有回显选项,这>>是由 shell 完成的,而不是由命令完成的。它告诉 shell 将命令的标准输出附加到文件中。

正如@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_

或者使用ed

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 慢一点,但你的情况不同寻常。

相关内容