Java Ubuntu:awk:line 1:正则表达式中的Bashscript错误超出了实现大小限制

Java Ubuntu:awk:line 1:正则表达式中的Bashscript错误超出了实现大小限制,java,regex,bash,awk,processbuilder,Java,Regex,Bash,Awk,Processbuilder,我正在尝试将此代码应用于snpEff生成的带注释的文件: (我的操作系统是Ubuntu) 我得到以下错误: awk: line 1: regular expression /splice_acc ... exceeds implementation size limit 有人能帮忙吗?我知道这个问题不久前被另一个人问过,但我的技术水平不高,我不理解给出的解决方案。提前谢谢 我还打算稍后在Java GUI中使用此代码,我将使用ProcessBuilder使用以下代码运行它: specie

我正在尝试将此代码应用于snpEff生成的带注释的文件: (我的操作系统是Ubuntu)

我得到以下错误:

awk: line 1: regular expression /splice_acc ... exceeds implementation size limit
有人能帮忙吗?我知道这个问题不久前被另一个人问过,但我的技术水平不高,我不理解给出的解决方案。提前谢谢

我还打算稍后在Java GUI中使用此代码,我将使用ProcessBuilder使用以下代码运行它:

    speciesFastaVersionCH = "SL2.50";

    String longInputcmd4b = "ch/ || $10~/^1\\/1/ && ($11~/^1\\/0/ || $11~/^0\\/0/ || $11~/^0\\/1/) && $1~/^[0-9X]*$/ && /splice_acceptor_variant|splice_donor_variant|splice_region_variant|stop_lost|start_lost|stop_gained|missense_variant|coding_sequence_variant|inframe_insertion|disruptive_inframe_insertion|inframe_deletion|disruptive_inframe_deletion|exon_variant|exon_loss_variant|exon_loss_variant|duplication|inversion|frameshift_variant|feature_ablation|duplication|gene_fusion|bidirectional_gene_fusion|rearranged_at_DNA_level|miRNA|initiator_codon_variant|start_retained/ {$3=$7=\"\"; print $0}' | sed 's/  */ /g' | awk '{split($9,a,\":\"); split(a[2],b,\",\"); if (b[1]>b[2] || $1~/";
    StringBuilder cmd4 = new StringBuilder().append("\"").append("grep -v '^##' ").append(outputFilecmd3).append(" | awk 'BEGIN{FS=\" \"; OFS=\" \"} $1~/").append(speciesFastaVersionCH).append(longInputcmd4b).append(speciesFastaVersionCH).append("ch/) print $0}' > ").append(outputFilecmd5).append("\"");



    System.out.println("Here is cmd4:" + cmd4.toString());
    String [] gatkArray1 = cmd1.split(" ");
    String [] gatkArray2 = cmd2.split(" ");
    String [] gatkArray3 = {"bash", "-c", cmd3};


    String [][] gatkArrays = {gatkArray1, gatkArray2, gatkArray3};


    ProcessBuilder pb = new ProcessBuilder(gatkArray3);
    pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
    pb.redirectError(ProcessBuilder.Redirect.INHERIT);
    Process p = pb.start();

awk
的实现不支持该长度的正则表达式

具体来说,您使用的是
mawk
,其中最大正则表达式限制为400,包括
/

$ true | mawk "/$(printf '%397s')/"
(no output)

$ true | mawk "/$(printf '%398s')/" 
mawk: line 1: regular expression /           ... exceeds implementation size limit
您可以重写awk脚本以使用较短的正则表达式文本(POSIX保证的最大大小为),也可以切换到类似
gawk
的实现,其中唯一的限制是Linux的最大参数大小为128KiB:

$ true | gawk "/$(printf '%131069s')/"
(no output)

$ true | gawk "/$(printf '%131070s')/"
bash: /usr/bin/gawk: Argument list too long

从安全角度来看,顺便说一句,这是一个非常非常可怕的想法。正如在中一样,我最近参与了代码质量指导方针的开发,该指导方针明确规定,在任何情况下都不要通过字符串连接来组装shell解释的代码。这种做法造成的现实世界中可利用的安全漏洞并不难发现——如果您正在寻找示例,请搜索“外壳注入漏洞”。将数据从代码带外传递。也就是说,您可以运行
['bash'、'-c'、'echo“第一个参数是$1”、'this is$0'、'this is$1']
,并且在脚本之后传递的值仍然是数据,而不是作为代码进行解析。谢谢,我也将对此进行研究。不过,我正在开发一个开源工具,作为一个新手,愤怒的程度与不理解人们在这个论坛上说的话成正比&&代码99.99%的时间不起作用&&只需要几个小时就可以让命令行代码(由其他人编写!)通过java工作:/谢谢!我在bash中安装了gawk,用gawk替换了第一个awk,它成功了。非常感谢你的帮助
$ true | gawk "/$(printf '%131069s')/"
(no output)

$ true | gawk "/$(printf '%131070s')/"
bash: /usr/bin/gawk: Argument list too long