我试图替换所有这一行,但数字:
looktype="123"
所以只显示数字。
这可以通过任何简单的方式实现吗?
{sub ("look type=\"[0-9]{0,3}", "TEST")}
我正在尝试这个awk
,但没有成功。我相信“sub”和 {0, 3} 会产生干扰。
答案1
在扩展正则表达式(ERE),表示在和次之间重复。 awk 实现了扩展的正则表达式,但是 awk 的历史实现没有这种用于重复间隔的大括号语法。这X{m,n}
X
m
n
POSIX标准指定 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
。