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

4

我有这样一个格式的输出:

/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);
    }
}

3
请注意,"caret"和"carrot"之间有微妙的区别。 - Andreas Rejbrand
1
谢谢,caret 确实是我想要的。 - Rick Smith
@Chriszuma 是的,它会给出这个错误 "awk: ./example.awk:7: (FILENAME=- FNR=1) fatal: Unmatched [ or [^: /[^].*@/"。 - Rick Smith
2
如果您使用/\^.*@/(无双引号,真正的正则表达式),会发生什么呢?祝你好运。 - shellter
5个回答

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

您好 Chris


谢谢你的回答!但我认为这对我不适用,因为我的awk代码比我提供的更多。改变分隔符会破坏其他部分 :( - Rick Smith
这个可以运行,你只需要在两个不同的字符上匹配 "^" 并分割字符串。请参考我的编辑答案。 - Chris
不错!在很多方面,我认为这是一个更简单的解决方案,因为它是基于2个字符进行分割,而不是处理混乱的正则表达式捕获。我接受了其他答案,只是因为这个问题实际上并没有回答如何转义^,未来读者可能想知道这一点。再次感谢您提供的好解决方案。 - Rick Smith

2

另一种可能性是使用gawk:

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

我其实更喜欢shellter的正则表达式,它几乎相同但略微简单:/^.*@/。这几乎相同,所以我会把它标记为我接受的答案。 - Rick Smith
这个答案基于一个假设,即您想要从打印的内容中排除前导的 "^/",只留下 "../I/want/this"。如果您愿意,您可以通过调整 substr() 的值来使用 POSIX awk 和 @shellter 的正则表达式获得所需的结果。 - pholser

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

在这种情况下应该可以工作

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

0
说起带插入符号的 awk 正则表达式,这里有一些需要注意的地方。尤其是关于插入符号“^”的使用,可能乍一看会让人觉得奇怪,因为后面那个正则表达式仅仅是把第一个正则表达式翻倍了而已:

invalid :: /[^]/

VALID :: /[^][^]/

对于第一个正则表达式,很明显它是无效的,原因如下:
  • 在字符类别 […] 中,插入符号 ^ 必须被转义。
而对于第二个正则表达式,之所以有效,是因为它表示:
  • 任何东西都可以匹配,但除了 ][ 或者 ^ 之外。
这里的顺序非常重要:如果将第二个正则表达式写成 /[^[]^]/,那么结果就会是,gawk 和 mawk 会静默失败(或者根本没有匹配到你想要的结果),而 nawk 则直接报错。

-1
echo '/ignore-this/^/../I/want/this@ignore-this' | 

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

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

/../I/want/this

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接