[英]awk keep field separator when using sub
我正在尝试“模糊处理” 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
似乎子功能摆脱了字段分隔符。 我还尝试了不带第三个arg的sub,它保留了字段分隔符,但还在不应该更改的地方更改了“ t”:
if ($x == AWK_COR_VAR) {sub($x, AWK_OBF_VAR)};
输出:
b7=documenb7.getElementById(t)
sub
并没有摆脱您的字段分隔符。 发生了什么事:
$1
.. $NF
时,它会固有地丢弃字段分隔符文本。 $0
最初保留为原始行文本。 $1
)时,awk会重新生成 $0
来表示所有字段的串联,并用OFS
分隔输出字段分隔符。 默认情况下, OFS
是一个空格。 因此,当您print $0
,有两种情况:(1)您没有修改任何字段,因此您看到的是原始的完整行。 (2)您确实修改了一个字段,所以您看到的是一条删除了所有标点符号的行。
如果您沿着这条路继续下去,您需要做的就是保留原始标点符号。 这意味着不使用FS
进行令牌化。 您将需要做更多的事情,例如迭代扫描单词边界,检测触发令牌以及在运行时建立结果行。 或类似的东西。
但是要当心! 您还需要注意的是,如果您不够熟练,则可能会在引号字符串( "I want a t-shirt."
)和Javascript属性名称( blort = foo.t.bar
)中找到变量名"I want a t-shirt."
blort = foo.t.bar
)。
我真正的建议是仅使用几种现有的Javascript混淆器之一。 Google的Closure https://developers.google.com/closure/是一个不错的选择,它是包含混淆的工具包。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.