当分隔符之一是 4 个下划线(不是一个)时,多个分隔符 awk

当分隔符之一是 4 个下划线(不是一个)时,多个分隔符 awk
PWD=sgy_comp.20170328_090951.20170328_090730.d_0327____20170325_002526.seiscat

.我需要对这两者进行界定____

如果我尝试使用(这不起作用)的正常语法,[.____]那么它会将 视为____4 个分隔符(因为它____与 相同_

例子:

basename $PWD
sgy_comp.20170328_090951.20170328_090730.d_0327____20170325_002526.seiscat

basename $PWD|awk -F[."____"] '{print $4}'
090951

我正在努力获得 的回报d_0327。我明白为什么它没有按照我想要的方式工作,只是寻找正确的语法来使其工作。

答案1

[<set>]火柴字符(扩展为整理元素使用某些工具并在某些情况下)从提供的<set>

[.____]特别匹配字符,前提是它是.or _、 or _、 or _or _。不用说,[.____]是一样的[._]

如果要匹配两个字符串中的任何一个,则需要|交替运算符:

awk -F '\\.|____' '{print $4}'

使用现代(和标准)awk,您还可以编写它:

awk -F '\\.|_{4}' '{print $4}'

另请注意,[...]需要对 shell 进行引用,因为[...]它也恰好是 shell 通配符。就您而言,您仅引用了____外壳部分。这不是必需的,因为_这对 shell 来说并不特殊。这意味着-F[."____"],如果当前目录中有一个名为-F.或 的文件-F_,则 shell 通配符将-F[."____"]在传递到 之前扩展到那些文件awk。如果没有,-F[.____]将被传递到awk(尽管有些 shell 会报告一个错误,而不是关于不匹配的 glob)。

相关内容