Bash 正则表达式在awk上不用作字段分隔符

Bash 正则表达式在awk上不用作字段分隔符,bash,awk,sed,Bash,Awk,Sed,我有一个文本文件foo.txt,其中包含混合了标点符号的单词 我想做的是使用awk过滤每个标点符号,所以我使用了一个正则表达式作为字段分隔符,比如awk-F'[^a-zA-Z]+''{print$0}'foo.txt,我面临的问题是文本保持与原始文本一样,没有任何内容被过滤 有人知道为什么会这样吗 输入 ?喂?怎样你呢?” 再见,呵呵。哈哈 预期结果 你好,你好吗 再见呵呵哈哈大笑 p.D 我知道我可以用sed实现类似这样的结果sed的/[[:punct:]///g'foo.txt或sed的/[

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

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

有人知道为什么会这样吗

输入

?喂?怎样你呢?”
再见,呵呵。哈哈

预期结果
你好,你好吗
再见呵呵哈哈大笑

p.D

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

如果你想知道在哪里可以找到这背后的规则,我想指出:

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

说明

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

变量和特殊变量

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

当引入新字段时,找到重新计算
$0
的规则有点困难,但这基本上就是规则

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

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

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

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

$0
是整行!移除场分离器后。。。我不明白你的问题。在这两种情况下,
awk-F'[^a-zA-Z]+'{print$0}'foo.txt
sed的//[:punct:]//g'foo.txt
您告诉每个人删除(所有不是带
awk的大写或小写字母)和(所有标点符号都带
sed`),结果相同。你想得到什么?天哪!谢谢大家!@EmiI试图找出我试图使用的awk命令不起作用的原因@DavidC.rankin但我在过去30分钟里学到了很多东西,所以我认为awk在实际使用时没有考虑字段分隔符。问题是我没有以正确的方式访问这些值@大卫·兰金