首页 > 解决方案 > 如何将 awk 与多值分隔符一起使用

问题描述

我如何使用awk包含多值的分隔符:“#@$”

我有这样的文件:Test1#@$Test2#@$Test3#@$Test4 我需要提取“Test2”。执行此命令后:awk -F "#@$" '{print $2}',什么都没有显示>

在那之后awk -F "#@$" '{print $1}'我得到了完整的线路

有任何想法吗?

标签: linuxshellunix

解决方案


您遇到的问题是字段分隔符FS被认为是正则表达式。<dollar>-字符 ( $) 在正则表达式中具有特殊含义,因为它表示行尾的锚点。解决方案是将它转义两次,因为 <backslash>-转义被解释了两次;一次用于字符串的词法处理,一次用于处理正则表达式:

awk -F '#@\\$' '{print $1}'

扩展正则表达式FS可用于分隔字段,方法是直接或作为使用-Fsepstring 选项的结果将包含表达式的字符串分配给内置变量。变量的默认值FS应为单个 <space>。以下描述了FS行为:

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

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

来源:POSIX awk 标准


括号表达式外的<dollar-sign> ( $) 应将其结束的表达式或子表达式锚定到字符串的末尾;这样的表达式或子表达式只能匹配以字符串的最后一个字符结尾的序列。例如,字符串中的 ERE和匹配,但在字符串ef$(ef$)匹配失败,并且 ERE有效,但永远无法匹配,因为阻止了表达式匹配以最后一个字符结尾的字符。efabcdefcdefabe$ffe$

来源:POSIX 扩展正则表达式


推荐阅读