在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命令批量替换文件内容

从另一个 Perl 脚本内部调用 Perl 搜索和替换命令时不起作用

perl 替换文件夹中的多个文件

如何在Perl中将十六进制转换为字符串

如何在 perl 正则表达式替换命令中使用 unicode 字符?

Perl处理数据:s替换split和Join