Pie*_*r A 5 shell string files
环境:linux shell或更好,busybox中的ash shell(示例系统: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
Run Code Online (Sandbox Code Playgroud)
并考虑到尝试将此变量用作通用命令的参数会产生错误,例如:
echo "${a}" #fails
awk -v VAR_A="${a}" '<program>' #fails
Run Code Online (Sandbox Code Playgroud)
(失败是由于:http : //www.in-ulm.de/~mascheck/various/argmax/)
您如何将这样的变量写入文本文件,可能仅使用简单的命令而不是 sed/awk/perl/其他强大的解释器。
理想情况下,文本文件应如下所示:
word 1
word 2
word 3
...
Run Code Online (Sandbox Code Playgroud)
而不喜欢:
word 1\nword 2\nword 3\n...
Run Code Online (Sandbox Code Playgroud)
Update1:有人问“为什么你不能改变产生变量的脚本$a?”。因为我不能因为,比如说,缺乏授权(“脚本一直工作到今天,所以你只能修复打印部分”)。因此$a,给出了它的格式,我只能找到一种将其打印到文件的方法。
Update2:使用建议的“here docs”解决了大部分问题,但我仍然将内容打印在一行中。也许是我的配置?
您可以在此处制作文档并使用cat:
$ cat <<EOT >output
$a
EOT
$ wc -l output
40000
Run Code Online (Sandbox Code Playgroud)
我不知道你的 Busybox 到底有多强大ash(它是可配置的),但它应该可以在任何地方使用,即使根本没有内置插件。它将变量值扩展为一个准文件,然后cat将其提供给,而不是将值本身放入命令行。
由于您"\n"的字符串中似乎有要删除的文字,因此您还可以在参数替换期间使用字符串替换。这可以在 Busybox 的 之外进行配置ash,在这种情况下,您必须转到sed。如果你有这个(非 POSIX)扩展,你可以使用${var//\\\n/$NEWLINE}:
$ busybox ash
$ foo="x\ny\nz"
$ echo "$foo"
x\ny\nz
$ NEWLINE="
"
$ echo "${foo//\\\n/$NEWLINE}"
x
y
z
Run Code Online (Sandbox Code Playgroud)
这与 Bash 的语法相同;${var/pattern/replacement},pattern如果以/. 看起来你ash已经配置了很多,所以这可能根本不存在。在这种情况下,您可能不得不使用sed,尽管我猜明智地使用IFS并且read会让您解决这个问题并重建正确的字符串。