我正在尝试运行 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
。
在 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