在ISO文件上使用时,Perl hex替换(s /// g)无效

问题描述 投票:0回答:2

我正在尝试在USB上安装Live Kali Linux,而不会在启动时发出两声嘟嘟声。我发现the fifth post in this thread说:

这也取决于UEFI与BIOS

对于BIOS,您可以在ISO文件本身上使用以下PERL脚本,它将处理iso中存在的任何位置^ G:

perl -p -i -e 's;\x6d\x65\x6e\x75\x07;\x6d\x65\x6e\x75\x20;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;\x69\x6e\x73\x6d\x6f\x64\x20\x70\x6c\x61\x79\x0a\x70\x6c\x61\x79\x20\x39\x36\x30\x20\x34\x34\x30\x20\x31\x20\x30\x20\x34\x20\x34\x34\x30\x20\x31;\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20;g' your-kali.iso

但是字符串仍然在iso中。

为什么不换?

perl hex iso9660
2个回答
1
投票

您正在一次读取一行,该行被定义为直到换行(包括)的字节序列。所以$_永远不会在任何地方都有换行,但最后。

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\nplay 960 440 1 0 4 440 1\n/#nsmode play\n#lay 960 440 1 0 4 440 1\n/;

   END { print $buf }
' your-kali.iso

1
投票

perl -p -e CODE通常在输入的每一行上运行指定的CODE,其中行(在POSIX-y系统上)由换行符(\x0a)分隔,因此此代码不允许您在搜索模式包含\x0a的地方进行替换。

我的方法(这是Perl,所以有很多方法可以做到这一点)会更像

perl -p -i -e '$_="" if $_ eq "insmod play\n" || 
               $_ eq "play 960 440 1 0 4 440 1\n"' your-kali.iso

当行匹配两个目标模式之一时(即,将它们从输出中删除,而不是用空格字符串替换它们),这将使用空字符串替换输入行。

© www.soinside.com 2019 - 2024. All rights reserved.