我有这种格式的输出:
/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);
}
}
另一种可能性,使用 gawk:
#!/opt/local/bin/gawk -f
{
if (match($0, /[\^]\/(.*)@/, pieces)) {
print pieces[1];
}
}
> 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克里斯
awk -F'\\^|@' '{print $2}'
在这种情况下应该有效
kent$ echo "/ignore-this/^/../I/want/this@ignore-this"\
|awk -F'\\^|@' '{print $2}'
/../I/want/this
说到带有插入符
awk
的regex
"^"
,乍一看可能看起来很奇怪,为什么后者仅对第一个regex
加倍有效:
无效 ::
/[^]/
有效 ::
/[^][^]/
第一个无效,原因很明显:
^
的转义 […]
第二个是有效的,因为它实际上代表:
]
、[
或 ^
这里的顺序实际上很重要:将其写为
/[^[]^]/
,而发生的情况是 gawk
和 mawk
只是默默地失败(或者匹配一些与你的初衷完全不相近的东西),而 nawk
只是出错了
echo '/ignore-this/^/../I/want/this@ignore-this' |
gawk NF=NF FS='.*\^|@.*' OFS=
mawk '$0=$2;' FS='[@^]'
/../I/want/this