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