ユニバーサルシェルインタプリタを使用して、\ nを含む大きなテキストを含む変数をファイルに書き込みます。どうすればいいですか?

ユニバーサルシェルインタプリタを使用して、\ nを含む大きなテキストを含む変数をファイルに書き込みます。どうすればいいですか?

環境:Linuxシェル以上、busyboxのashシェル(例:システム:Openwrt)。

文字列変数が与えられると大きいテキスト"${a}"は次のように構成されています。

for index in $(seq 1 40000); do #it is 40000 for a reason, it helps if you want to reproduce the error on your system.
   a="${a}""\n""word ${index}"
done

この変数を通常のコマンドの引数として使用しようとするとエラーが発生することを検討してください。たとえば、次のようになります。

echo "${a}" #fails
awk -v VAR_A="${a}" '<program>' #fails

(失敗の理由は次のとおりです。http://www.in-ulm.de/~mascheck/various/argmax/)

sed/awk/perl/その他強力なインタプリタの代わりに単純なコマンドを使用してこれらの変数をテキストファイルに書き込む方法。

理想的には、テキストファイルは次のようにする必要があります。

word 1
word 2
word 3
...

次の代わりに:

word 1\nword 2\nword 3\n...

アップデート1:誰かが「変数を生成するスクリプトをなぜ変更できないのですか$a?」と尋ねました。なぜなら、権限が不足してできないからです(」このスクリプトは現在まで動作するため、印刷部分のみを変更するだけです。"). したがって、$aその形式はすでに提供されており、ファイルとして印刷する方法のみを見つけることができます。

アップデート2:提案された「ここの文書」を使用すると、ほとんどの問題が解決されましたが、内容はまだ1行に印刷されます。たぶん私の構成ですか?

答え1

あなたは一つ作ることができますここのドキュメントそして使用cat

$ cat <<EOT >output
$a
EOT
$ wc -l output
40000

あなたのBusyboxがどれほど強力なのか正確にはわかりませんが、ash(設定可能な)組み込みプログラムがまったくない場合でも、どこでも動作するはずです。cat値自体をコマンドラインに入力する代わりに、変数の値を準ファイルに展開して割り当てます。


"\n"文字列からリテラルを削除したいと思うので、パラメータ置換中に文字列置換を使用することもできます。これできるこの(非POSIX)拡張がある場合は、次のものを使用できますashsed${var//\\\n/$NEWLINE}

$ busybox ash
$ foo="x\ny\nz"
$ echo "$foo"
x\ny\nz
$ NEWLINE="
"
$ echo "${foo//\\\n/$NEWLINE}"
x
y
z

これは同じ構文です。バッシュで;で始まる${var/pattern/replacement}場合、patternグローバル位置はどこですか/ashいろいろなものを構成したようなので、存在しないかもしれません。この場合、 and を使用する必要があるかもしれませんが、 and を賢く使用すると、この問題を解決し、正しい文字列を再構成できるとsed思います。IFSread

答え2

busybox seq -s'
word ' 4000 | 
sed '/000/w /dev/fd/2' |  
wc -l

出力

word 1000
word 2000
word 3000
word 4000
4000

busybox組み込み関数を使用しseqて区切り文字を指定できる必要がありますword。必要に応じて、>redirectその内容をファイルとして保存できます。上記の例では、sed出力を理解するために4000行を表示する必要がないようにいくつかの部分に分割しましたが、すべて印刷されています。これを支えないならbusyboxアップグレード

したがって、基本的にすべきことは次$aのとおりです。

busybox seq -s'
word ' $MAX_INCREMENT >$TO_FILE

関連情報