Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex AWK匹配以数字开头的字符串_Regex_Bash_Unix_Awk - Fatal编程技术网

Regex AWK匹配以数字开头的字符串

Regex AWK匹配以数字开头的字符串,regex,bash,unix,awk,Regex,Bash,Unix,Awk,我想使用awk打印文件的所有行,其中每行的第一个元素以数字开头。以下是文件中包含的数据和使用的命令的详细信息: awk '{ $1 ~ /^\d[a-zA-Z0-9]*/ }' filename 文件名内容: 12.44.4444goad ABCDEF/END LMNOP/START joker 98.0 kites 使用的命令: awk '{ $1 ~ /^\d[a-zA-Z0-9]*/ }' filename 运行上述命令后,提示符上不会显示任何结果。 请告诉我是否需要对上

我想使用
awk
打印文件的所有行,其中每行的第一个元素以数字开头。以下是文件中包含的数据和使用的命令的详细信息:

awk '{ $1 ~ /^\d[a-zA-Z0-9]*/ }' filename
文件名内容:

12.44.4444goad ABCDEF/END   
LMNOP/START joker   
98.0 kites
使用的命令:

awk '{ $1 ~ /^\d[a-zA-Z0-9]*/ }' filename
运行上述命令后,提示符上不会显示任何结果。
请告诉我是否需要对上述命令进行任何更正。

放下大括号和
\d
,如下所示:

awk ' $1 ~ /^[0-9]/ ' filename
Awk程序分块提供。块是
模式
对,其中
默认为
{print}
。(空模式默认为true

/\d/
是一个perl ism,可能在某些版本的
awk
中工作—在我尝试过的版本中不工作*。您需要传统的
/^[0-9]/
或POSIX
/^[:digit:]/
符号

*
gnu和ast要打印以数字开头的行,可以尝试以下操作:

awk '/^[[:digit:]]+/' file

正如@HenkLangeveld所指出的,您的语法不正确。此外,正则表达式
\d
在awk中不可用。

从您尝试的解决方案来看,您似乎想要:

 awk 'NF>1 && $1 ~ /^[0-9.]*$/' filename
perl -lane 'use POSIX qw(strtod); my ($num, $end) = strtod($F[0]);
    print unless $end;' filename
如果要包含小数点,需要显式匹配
,并且需要
$
锚定以使
*
有意义。这将丢失第一列看起来像
5e39
-2.3
的行。您可以尝试使用以下方法来捕获这些案例:

awk 'NF>1 && $1 ~ /^-?[0-9.]*(e[0-9*])?$/' filename
但是在这一点上,我要告诉您使用
perl
,不要再尝试使用
awk
来增强健壮性。 可能(这将打印空行…不确定您想要哪种行为):


这将使用strtod解析数字,并告诉您字符串末尾不属于该数字的字符数。

如果您只需要在行首匹配至少一个数字,则只需
^
匹配行首和
[0-9]
匹配数字即可

您可以将花括号与
if
语句一起使用:

awk '{if($1 ~ /^[0-9]/) print $0}' filename
但这只是一个简单的例子:

awk '$1 ~ /^[0-9]/' filename

从技术上讲,语法是正确的。;-)结果恰好相当于
{1}
{0}
@HenkLangeveld是的,根据awk,语法是正确的,但不符合人类的意图:)感谢Håkon的输入。错误的词是“语义”。该代码在语法上是有效的,但在语义上没有达到预期效果。不需要
+
,只要
/^[:digit:][]/
就足够了。感谢William的输入。另外,我不能使用perl,因为手头的任务只允许使用unix命令。感谢Henk的输入Hanks John的输入。行的开头可以有空格吗?如果是这样,请在您发布的示例输入/输出中显示一个示例。我们应该测试
$1
还是
$0
,这会产生不同。行首将没有空格。此外,我还能够使用Håkon、William、Henk和John的建议完成任务。