从范围分隔符中提取第三组文本

从范围分隔符中提取第三组文本

我有一个文件.txt包含单行:

[MOVING] From [/source/foo.txt] to [/dest/bar.txt]

我想找到一个正则表达式,基本上可以提取一对方括号内的第三组[]

期待 /dest/bar.txt

到目前为止,我想出了:

$> cat file.txt | grep ".*From.*to.*" | grep -oP  '(?<=to ).*$' | cut -d "[" -f 2 |  cut -d "]" -f 1

它有效,但根本不喜欢优雅的解决方案。有谁知道如何实现这一目标?

答案1

grep -o '\[[^]]*\]$' file.txt | sed 's/\[//; s/\]//'

这会将 grep 锚定到行尾,然后提取方括号和所需的文本。该sed命令去掉括号。

答案2

$ echo "$a"
[MOVING] From [/source/foo.txt] to [/dest/bar.txt]
$ echo "$a" |egrep -o '\[.[^ ]+\]$'
[/dest/bar.txt]

答案3

您可以使用cut提取您感兴趣的左括号后面的部分,并使用 sed 完成以删除加工括号后面的部分。

cut -d '[' -f 3 | sed 's/].*//'

或者,您可以使用单个 sed 或 awk 命令来完成此操作。

sed 's/^[^[]*\[\([^\]\)]*\][^[]*\[\([^\]\)]*\][^[]*\[\([^\]\)]*\].*$/\3/'
gawk -F '(^|\\])[^[]*(\\[|$)' '{print $4}'
awk '{split($0, a, "(^|\\])[^[]*(\\[|$)"); print a[4]}'

在这两个 awk 命令中,字段 1 为空,因为第一个分隔符从字符串的开头开始,因此第三个括号内的组是字段 4。

相关内容