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在实际使用时没有考虑字段分隔符。问题是我没有以正确的方式访问这些值@大卫·兰金