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オプションを使用しますsedsed依存関係ができるだけ少ないメモリを使用するように)。

また、エコオプションはありません。これは>>コマンドではなくシェルによって行われます。これは、コマンドの標準出力をファイルに追加するようにシェルに指示します。

@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"

その後、改行文字を削除して一度に 1 つずつ読み取るには、次のようにします。

{
    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より少し遅いですが、状況は珍しいです。

関連情報