Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Awk参数列表太长,但仅当我增加变量中的数据时_Bash_Variables_Awk_Arguments - Fatal编程技术网

Bash Awk参数列表太长,但仅当我增加变量中的数据时

Bash Awk参数列表太长,但仅当我增加变量中的数据时,bash,variables,awk,arguments,Bash,Variables,Awk,Arguments,我编写了一个工作的bash脚本,它在一些文件上循环读取它们的纯文本,用sed修改它,并用修改后的文本替换模板文件中的字符串。 我通过为替换部件去掉了sed(我发现在我的特定情况下,将其用于多行替换相当困难)。 awk在我尝试增加文件中的段落数(从200段增加到225段)之前一直运行良好。我得到的错误是script.sh:line 11:/usr/bin/awk:Argument list太长,模板文件现在比工作时(开始,200段,结束)要早(开始,14段,结束) 为什么会发生这种情况?我如何解决

我编写了一个工作的bash脚本,它在一些文件上循环读取它们的纯文本,用
sed
修改它,并用修改后的文本替换模板文件中的字符串。
我通过为替换部件去掉了
sed
(我发现在我的特定情况下,将其用于多行替换相当困难)。
awk
在我尝试增加文件中的段落数(从200段增加到225段)之前一直运行良好。我得到的错误是
script.sh:line 11:/usr/bin/awk:Argument list太长
,模板文件现在比工作时(开始,200段,结束)要早(开始,14段,结束)

为什么会发生这种情况?我如何解决它,可能保留
awk

为什么
awk
现在只打印14段,而不是以前可以打印的200段?
为什么在出现错误后,
set-e
不停止脚本

该脚本将一直工作到文件变得太大:

#/bin/bash
set-e
cp template.bkp template.txt
对于文本格式的文件/*;做
modifiedText=$(sed'…'$文件| fold-w 50-s)
修改文本+=”
#替换字符串“
awk-v modifiedText=“$modifiedText”{gsub(#REPLACESTRING),modifiedText,$0);print}'template.txt>template-tmp.txt&&mv template-tmp.txt template.txt
完成
awk'{gsub(“#REPLACESTRING”,”,$0);print}'template.txt>template-tmp.txt&&mv template-tmp.txt template.txt
[...]
模板文件如下所示:

Opening

#REPLACESTRING

Closing

快速阅读后,看起来您正在添加许多文件并添加页眉和页脚。如果是这样,最好恢复操作

tempfile=$(mktemp)
sed“…”text/*| fold-w 50-s>>“$tempfile”
sed-e'/#REPLACEMENT/{'-e“r$tempfile”-e'd'-e'}'模板>输出
rm“$tempfile”

sed
可以对多个文件进行操作,无需循环。还可以使用
bash
作为操作的编排,将文本保存在文件中,并使用
awk
sed
等工具进行文本处理,这是您部分完成的。

快速阅读后,看起来您添加了许多文件并添加了页眉和页脚。如果是这样,最好恢复操作

tempfile=$(mktemp)
sed“…”text/*| fold-w 50-s>>“$tempfile”
sed-e'/#REPLACEMENT/{'-e“r$tempfile”-e'd'-e'}'模板>输出
rm“$tempfile”

sed
可以对多个文件进行操作,无需循环。还可以使用
bash
作为操作编排,将文本保存在文件中,并使用
awk
sed
等工具进行文本处理,这是您部分完成的。

您的操作系统对命令的所有参数的组合长度有限制,您正通过
awk-v modifiedText=“$modifiedText”
…”达到这个极限。同意上面的说法,这不是
awk
问题,而是“操作系统命令行的大小”问题。最好将工作输出重定向到tmp文件,然后使用
awk
处理tmp文件。祝你好运。@sheller知道怎么做吗?
echo“First line”>/tmp/myFile;读行时;执行echo“$line”>>/tmp/myFile;完成
将是一种方式。您可能可以将整个过程重写为一个
awk
程序。完成部分工作,并与您一起发布一个新问题,以及一小部分示例输入、该输入所需的输出、您当前的输出和任何错误消息。在鼠标选中的文本上使用编辑菜单中的
{}
工具将其正确格式化为
code/data/output/errMsgs
。好运气解释你想做什么,而不仅仅是你的解决方案。快速阅读后,看起来您正在添加许多文件并添加页眉和页脚。如果是这样,最好还原操作。您的操作系统对一个命令的所有参数的组合大小有一个限制,并且您通过
awk-v modifiedText=“$modifiedText”
…”达到该限制。同意上面的说法,这不是
awk
问题,而是“操作系统命令行的大小”问题。最好将工作输出重定向到tmp文件,然后使用
awk
处理tmp文件。祝你好运。@sheller知道怎么做吗?
echo“First line”>/tmp/myFile;读行时;执行echo“$line”>>/tmp/myFile;完成
将是一种方式。您可能可以将整个过程重写为一个
awk
程序。完成部分工作,并与您一起发布一个新问题,以及一小部分示例输入、该输入所需的输出、您当前的输出和任何错误消息。在鼠标选中的文本上使用编辑菜单中的
{}
工具将其正确格式化为
code/data/output/errMsgs
。好运气解释你想做什么,而不仅仅是你的解决方案。快速阅读后,看起来您正在添加许多文件并添加页眉和页脚。如果是这样,最好恢复操作。