繁体   English   中英

正则表达式不能作为 awk 上的字段分隔符

[英]Regex not working as field separator on awk

我有这个文本文件foo.txt ,其中包含与标点符号混合的单词。

我想要做的是使用awk过滤每个标点符号,所以我使用了一个正则表达式作为字段分隔符,就像这样awk -F '[^a-zA-Z]+' '{ print $0 }' foo.txt ,我面临的问题是文本保持原样,没有过滤任何内容。

有谁知道为什么会这样?

输入

¿Hello? How... are foo you?' Bye ,, hehe '" .lol

预期结果
Hello How are foo you Bye hehe lol

PD
我知道我可以使用 sed 和类似这样的sed 's/[[:punct:]]//g' foo.txtsed s/[^A-Za-z]/" "/g foo.txt ,但我想知道为什么awk命令不起作用,我已经到处调查,但找不到答案,我无法入睡。

如果您想知道在哪里可以找到这背后的规则,我想指出Awk POSIX 标准

但是,您必须在两个位置找到答案:

描述

awk 实用程序应将每个输入记录解释为一系列字段,其中默认情况下,字段是非 <blank> 非 <newline> 字符的字符串。 可以使用FS内置变量或-F sepstring 选项更改此默认 <blank> 和 <newline> 字段分隔符。 awk 实用程序应表示记录中的第一个字段$1 ,第二个$2 ,依此类推。 符号$0表示整个记录; 设置任何其他字段会导致重新评估$0 分配给$0将重置所有其他字段和NF内置变量的值。

变量和特殊变量

对不存在的字段(即$NF之后的字段)的引用应评估为未初始化的值。 此类引用不应创建新字段。 但是,分配给不存在的字段(例如, $(NF+2)=5 )将增加NF的值; 使用未初始化的值创建任何中间字段; 导致重新计算$0的值,字段由OFS的值分隔 每个字段变量在创建时应具有字符串值或未初始化的值。 使用FS$0创建时,字段变量应具有未初始化的值,并且该变量不包含任何字符。

在引入新字段时找到重新计算$0的规则有点awk ,但这本质上是规则。

此外,语句print $0打印整个字段。 因此,根据上述内容,您首先需要重新计算您的$0 ,如@oguzismail的答案所示。

因此可以通过以下方式更改字段分隔符:

awk 'BEGIN{FS="oldFS"; OFS="newFS"}{$1=$1}1' <file>

备注:您不需要检查该行是否包含任何字段作为NF{$1=$1}因为{$1=$1}只会引入一个没有额外OFS的空字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM