{} 的替代正则表达式

{} 的替代正则表达式

我试图替换所有这一行,但数字:

looktype="123"

所以只显示数字。

这可以通过任何简单的方式实现吗?

{sub ("look type=\"[0-9]{0,3}", "TEST")}

我正在尝试这个awk,但没有成功。我相信“sub”和 {0, 3} 会产生干扰。

答案1

扩展正则表达式(ERE),表示在和次之间重复。 awk 实现了扩展的正则表达式,但是 awk 的历史实现没有这种用于重复间隔的大括号语法。这X{m,n}XmnPOSIX标准指定 awk 必须支持 ERE,但许多现有实现不兼容。

使用 GNU awk,间隔仅从 4.0 版本开始受支持。对于旧版本,您可以通过将POSIXLY_CORRECT环境变量设置为非空值来强制 gawk 兼容 POSIX :

POSIXLY_CORRECT=1 awk '{sub ("looktype=\"[0-9]{0,3}", "TEST"); print}'

某些发行版上 awk 的默认版本不是 gawk,而是 mawk,它更小、更快。 Mawk 不支持大括号表达式。有一个补丁可以解决这个问题,但由于 mawk 没有得到维护,因此它没有被广泛采用。

当重复次数较少时,可以拼出:

awk '{sub ("looktype=\"[0-9]?[0-9]?[0-9]?[0-9]?", "TEST"); print}'

答案2

您可以通过管道传输它sed以仅提取引号字符内的内容。

例如

$ echo 'looktype="123"' | sed -r -e 's/^.*"([^"]+)".*/\1/'
123

请注意,这-r是 GNU sed 特有的,它告诉 sed 使用扩展而不是基本正则表达式。其他版本sed没有它,或者可以使用-E它。否则,用 POSIX 基本正则表达式 (BRE) 将其写为:

sed -e 's/^.*"\([^"][^"]*\)".*/\1/'

答案3

awk(假设精确的输入您发布的内容)您也可以这样做:

awk -F'=' '{print $2}' | sed 's/"//g'

答案4

GNU 中的替代方案grep(我假设您有 Ubuntu 标签):

grep -o '[0-9]\+' your_file

Perl 的更便携的替代方案

perl -nle '/([0-9]+)/ and print $1' your_file

这两种选择并不完全相同。如果同一行上有多个数字字符串实例,它们的行为会有所不同。该grep语句将在单独的行上打印每个出现的数字,而该perl语句仅打印每行中最左边出现的数字字符串。这是由于 Perl 和正则表达式引擎内部实现的差异造成的grep

相关内容