[英]How to use awk with multivalue delimiter
我如何使用包含多值的awk
定界符:“#@ $”
我有这样的文件:Test1#@ $ Test2#@ $ Test3#@ $ Test4我需要提取'Test2'。 执行以下命令后: awk -F "#@$" '{print $2}'
,什么都不显示>
然后在那awk -F "#@$" '{print $1}'
我得到整行
有任何想法吗?
您遇到的问题是字段分隔符FS
被视为正则表达式。 <dollar>-字符( $
)在正则表达式中具有特殊含义,因为它表示行尾的锚点。 解决方法是对它两次转义,因为<backslash> -escapes被解释了两次。 一次在字符串的词法处理中,一次在处理正则表达式中:
awk -F '#@\\$' '{print $1}'
通过将包含表达式的字符串直接分配给内置变量
FS
或使用-F
sepstring选项的结果,可以使用扩展的正则表达式来分隔字段。FS
变量的默认值应为单个<space>。 下面介绍FS
行为:
- 如果
FS
为空字符串,则行为未指定。如果
FS
是单个字符:
- 如果
FS
为<空格>,则跳过前导和尾随的<空白>和<换行符>; 字段应由一组一个或多个<blank>或<newline>字符定界。- 否则,如果
FS
是任何其他字符c
,则字段应由每次出现c
来界定。否则,
FS
的字符串值应被视为扩展的正则表达式 。 匹配扩展正则表达式的序列的每次出现都应定界字段。来源: POSIX awk标准
括号表达式之外的<dollar-sign>(
$
)应将表达式或子表达式的锚定到字符串的末尾; 这样的表达式或子表达式只能匹配以字符串的最后一个字符结尾的序列。 例如,EREef$
和(ef$)
与字符串abcdef
中的ef
匹配,但与字符串cdefab
中的ef
匹配,并且EREe$f
有效,但由于f
阻止了表达式e$
来自匹配以最后一个字符结尾。来源: POSIX扩展正则表达式
只需将$放在方括号[]中即可删除其特殊含义
> cat t1
Test1#@$Test2#@$Test3#@$Test4
> awk -F '#@[$]' '{print $2}' t1
Test2
>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.