在ISO文件上使用时,Perl hex替换(s /// g)无效
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在ISO文件上使用时,Perl hex替换(s /// g)无效相关的知识,希望对你有一定的参考价值。
我正在尝试在USB上安装Live Kali Linux,而不会在启动时发出两声嘟嘟声。我发现the fifth post in this thread说:
这也取决于UEFI与Bios
对于BIOS,您可以在ISO文件本身上使用以下PERL脚本,它将处理iso中存在的任何位置^ G:
perl -p -i -e 's;x6dx65x6ex75x07;x6dx65x6ex75x20;g' your-kali.iso
添加了蜂鸣声以便访问UEFI启动菜单,因此您仍可能会发出蜂鸣声。要删除它,您必须编辑grub.cfg并注释掉或删除以下两行:
insmode play 播放960 440 1 0 4 440 1
我使用live build对grub.cfg进行更改,生成iso,然后在闪存到usb之前运行perl脚本。
我设法用给定的Perl脚本删除BIOS的(x07)字节,所以我用“insmode play play 60 440 1 0 4 440 1”尝试了同样的事情(我在十六进制编辑器中打开了grub.cfg,复制了十六进制这个字符串,696E736D6F6420706C61790A706C61792039363020343430203120302034203434302031,并在每个字节的位置放置20)。
我运行了这个脚本perl -p -i -e 's;x69x6ex73x6dx6fx64x20x70x6cx61x79x0ax70x6cx61x79x20x39x36x30x20x34x34x30x20x31x20x30x20x34x20x34x34x30x20x31;x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20;g' your-kali.iso
。
但是字符串仍然在iso中。
为什么不换?
您正在一次读取一行,该行被定义为直到换行(包括)的字节序列。所以$_
永远不会在任何地方都有换行,但最后。
perl -i -pe'
s/^i(?=nsmode play$)/#/;
s/^p(?=lay 960 440 1 0 4 440 1$)/#/;
' your-kali.iso
这是独立评论的。如果要将它们替换为一组,则需要一个缓冲区。
perl -i -pe'
if (/^insmode play$/) {
$buf = $_;
$_ = "";
next;
}
$_ = $buf . $_;
$buf = "";
s/^insmode play
play 960 440 1 0 4 440 1
/#nsmode play
#lay 960 440 1 0 4 440 1
/;
END { print $buf }
' your-kali.iso
perl -p -e CODE
通常在输入的每一行上运行指定的CODE,其中行(在POSIX-y系统上)由换行符(x0a
)分隔,因此此代码不允许您在搜索模式包含x0a
的地方进行替换。
我的方法(这是Perl,所以有很多方法可以做到这一点)会更像
perl -p -i -e '$_="" if $_ eq "insmod play
" ||
$_ eq "play 960 440 1 0 4 440 1
"' your-kali.iso
当行匹配两个目标模式之一时(即,将它们从输出中删除,而不是用空格字符串替换它们),这将使用空字符串替换输入行。
以上是关于在ISO文件上使用时,Perl hex替换(s /// g)无效的主要内容,如果未能解决你的问题,请参考以下文章
从另一个 Perl 脚本内部调用 Perl 搜索和替换命令时不起作用