環境: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)拡張がある場合は、次のものを使用できますash
。sed
${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
思います。IFS
read
答え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