使用 awk 正则表达式捕获插入符 (^)

问题描述 投票:0回答:5

我有这种格式的输出:

/ignore-this/^/../I/want/this@ignore-this

我正在尝试使用 awk 正则表达式来捕获以下内容:

../I/want/this

这并不是特别困难,只是我无法弄清楚如何正确转义

^
,因此它不会被解释为新行或非新行。下面是我到目前为止所拥有的,它几乎可以工作,除了打印出来:

/ignore-this/^/../I/want/this

这是代码:

#!/bin/awk -f                                                                              
{
    if (match($0, "\^.*@")){
        print substr($0, RSTART, RLENGTH-1);
    }
}
regex awk gawk
5个回答
2
投票

另一种可能性,使用 gawk:

#!/opt/local/bin/gawk -f
{
    if (match($0, /[\^]\/(.*)@/, pieces)) {
        print pieces[1];
    }
}

2
投票
> echo '/ignore-this/^/../I/want/this@ignore-this' |\ 
awk -F"^" '{split($NF,a,"@");print a[1]}' 

输出:

/../I/want/this

这会将输入流拆分为所有“^”。然后它获取最后一个字段并将其拆分为“@”并打印字符串的前半部分。

编辑: 或者使用:

awk '/\^/{split($0,a,"[@^]");print a[2]}' file

HTH克里斯


0
投票
awk -F'\\^|@' '{print $2}'

在这种情况下应该有效

kent$  echo "/ignore-this/^/../I/want/this@ignore-this"\
        |awk -F'\\^|@' '{print $2}' 
/../I/want/this

0
投票

说到带有插入符

awk
regex
"^"
,乍一看可能看起来很奇怪,为什么后者仅对第一个
regex
加倍有效:

无效 ::

 /[^]/ 

有效 ::

/[^][^]/

第一个无效,原因很明显:

  • 在字符类中缺乏对独立插入符
    ^
    的转义
    […]

第二个是有效的,因为它实际上代表:

  • 除了
    ]
    [
    ^
  • 之外的任何内容

这里的顺序实际上很重要:将其写为

/[^[]^]/
,而发生的情况是
gawk
mawk
只是默默地失败(或者匹配一些与你的初衷完全不相近的东西),而
nawk 
只是出错了


0
投票
echo '/ignore-this/^/../I/want/this@ignore-this' | 

gawk NF=NF FS='.*\^|@.*' OFS=

mawk '$0=$2;' FS='[@^]'

/../I/want/this
© www.soinside.com 2019 - 2024. All rights reserved.