Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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
Unix awk在使用sub时保留字段分隔符_Unix_Awk - Fatal编程技术网

Unix awk在使用sub时保留字段分隔符

Unix awk在使用sub时保留字段分隔符,unix,awk,Unix,Awk,我试图“混淆”javascript代码(使其不可读以避免盗版) 我用awk来做这个。这对于长单词很好,但对于单字符单词则不行 输入文本: var t=document.getElementById(u) 预期产出: var b7=document.getElementById(b8) 实际产出: var b7 document getElementById b8 Awk代码: ${cor_var} is a unix variable which contains "t" in our e

我试图“混淆”javascript代码(使其不可读以避免盗版) 我用awk来做这个。这对于长单词很好,但对于单字符单词则不行

输入文本:

var t=document.getElementById(u)
预期产出:

var b7=document.getElementById(b8)
实际产出:

var b7 document getElementById b8
Awk代码:

${cor_var} is a unix variable which contains "t" in our example
${obf_var} is a unix variable which contains "b7" (the obfuscated variable)

awk -v AWK_COR_VAR="${cor_var}" -v AWK_OBF_VAR="${obf_var}" '

      # We use Non-word characters as field separator
      # Like this we can extract var/func
      BEGIN {FS="[^A-Za-z0-9_]+"}
      {
        if ($0 ~ AWK_COR_VAR) {
          # On a line containing our word, we go through each field till we find our word
          # and then we replace it with sub
          for ( x = 1; x < NF; x++ ) {
            # Output fields with space as delimiter
            if ($x == AWK_COR_VAR) {sub($x, AWK_OBF_VAR, $x)};
          }
          print $0;
        } else {print $0}
      }' $file
输出:

b7=documenb7.getElementById(t)

sub
没有去掉字段分隔符。正在发生的是:

  • 当awk将每行解析为字段
    $1
    时,它固有地丢弃字段分隔符文本<代码>$NF<代码>$0最初保留为原始行文本
  • 当您重新分配其中一个字段(例如,
    $1
    )时,awk将重新生成
    $0
    ,作为所有字段的串联,由输出字段分隔符OFS分隔<默认情况下,code>OFS是一个空格
  • 因此,当您打印$0时,您有两种情况:(1)您没有修改任何字段,因此您看到的是原始的完整行。(2) 您确实修改了一个字段,因此看到一行没有标点符号

    如果你继续沿着这条路走下去,你需要做的就是保留原来的标点符号。这意味着不使用
    FS
    进行标记化。您将需要做更多的事情,比如迭代扫描单词边界、检测触发器标记,以及在运行时构建结果行。或者类似的

    但要当心!您还需要意识到,如果您不够复杂,您可能会在带引号的字符串中找到变量名(
    “我想要一件t恤。”
    )和Javascript属性名(
    blort=foo.t.bar


    我真正的建议是只使用几个现有Javascript模糊器中的一个。谷歌的关闭,这是一个包含模糊处理的工具包,是一个不错的选择。

    你能选择另一个FS吗?e、 g.
    =
    ?或者当前的FS是必须的?同样
    sub($x,AWK\u OBF\u VAR,$x)
    可能不是您想要的。您可能需要
    $x=AWK\u OBF\u VAR
    我必须保持FS的原样(非单词字符:[^A-Za-z0-9\]+)我也尝试过$x=AWK\u OBF\u VAR,但同样的故事,它没有在输出中保留字段分隔符。谢谢您的回复。奇怪的是,当我使用sub($x,AWK_OBF_VAR)时,它在输出中保留字段分隔符,但在所有行中更新“$x”,因此对于$x='t',它将更新所有的't'。我来看看谷歌的解决方案。
    b7=documenb7.getElementById(t)