为什么我的 Perl 单行代码对于同一个命令有不同的输出

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

我正在尝试运行 perl oneliner 以从头文件“elf.h”获取字符串,该文件具有以下几行:-

#define ELFOSABIV_STDELF_V1          8U      // STD ELF ABI
#define ELFOSABIV_PRE_STDELF         7U      // latest abi version
#define ELFOSABIV_LATEST             6U      // latest abi version 

我正在尝试获取

ELFOSABIV_LATEST
版本,即
6U
。实际上我需要将此输出提供给可执行文件。所以我必须使用 Perl One liner 来简化它。

输出:-

在 Linux 中:-

perl -ne "print $1 if /#define\s+ELFOSABIV_LATEST\s+(\S+)/" /home/test/elf/elf.h
#define ELFOSABIV_LATEST             6U   // latest abi version 

在 Windows 中:-

perl -ne "print $1 if /#define\s+ELFOSABIV_LATEST\s+(\S+)/" /home/test/elf/elf.h
 6U

为什么上面windows和linux的输出有差异?打印前我需要设置一些东西吗?我需要确保 Windows 和 Linux 的输出都必须是

6U

perl
1个回答
0
投票

在 Linux shell 中,双引号内的美元符号

$
被解释为变量。由于
$1
未定义,它会被转换为空字符串,因此双引号参数实际上变为:

print  if /#define\s+ELFOSABIV_LATEST\s+(\S+)/

当传递给 perl 时,当

if
条件评估为 true 时,会打印整行。

您可以通过将单引号括在单引号中来解决此问题,以防止 shell 解释美元符号:

perl -ne 'print $1 if /#define\s+ELFOSABIV_LATEST\s+(\S+)/' /home/test/elf/elf.h
© www.soinside.com 2019 - 2024. All rights reserved.