繁体   English   中英

如何将awk与多值定界符一起使用

[英]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行为:

  1. 如果FS为空字符串,则行为未指定。
  2. 如果FS是单个字符:

    • 如果FS为<空格>,则跳过前导和尾随的<空白>和<换行符>; 字段应由一组一个或多个<blank>或<newline>字符定界。
    • 否则,如果FS是任何其他字符c ,则字段应由每次出现c来界定。
  3. 否则, FS的字符串值应被视为扩展的正则表达式 匹配扩展正则表达式的序列的每次出现都应定界字段。

来源: POSIX awk标准


括号表达式之外的<dollar-sign>( $ )应将表达式或子表达式的锚定到字符串的末尾; 这样的表达式或子表达式只能匹配以字符串的最后一个字符结尾的序列。 例如,ERE ef$(ef$)与字符串abcdef中的ef匹配,但与字符串cdefab中的ef匹配,并且ERE e$f有效,但由于f阻止了表达式e$来自匹配以最后一个字符结尾。

来源: POSIX扩展正则表达式

只需将$放在方括号[]中即可删除其特殊含义

> cat t1
Test1#@$Test2#@$Test3#@$Test4
> awk -F '#@[$]' '{print $2}' t1
Test2
> 

暂无
暂无

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

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