我有一个文件.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。