![如何从每个句子中提取最后带有 [xxx][xxxx] 模式的模式](https://linux22.com/image/177908/%E5%A6%82%E4%BD%95%E4%BB%8E%E6%AF%8F%E4%B8%AA%E5%8F%A5%E5%AD%90%E4%B8%AD%E6%8F%90%E5%8F%96%E6%9C%80%E5%90%8E%E5%B8%A6%E6%9C%89%20%5Bxxx%5D%5Bxxxx%5D%20%E6%A8%A1%E5%BC%8F%E7%9A%84%E6%A8%A1%E5%BC%8F.png)
我有一个包含这样句子的文件:
..........[xxxx][xxxx]
..........[xxxx][xxxx]
..........[xxxx][xxxx]
每句话末尾有两个[][],如何将[][]和[][]中的相应内容提取到一个新文件中,如下所示:
[xxxx][xxxx]
[xxxx][xxxx]
[xxxx][xxxx]
我尝试过终端正则表达式,但没有成功。谢谢,
答案1
grep
使用 GNU (或任何其他grep
支持该-o
选项的工具)尝试一下:
grep -o '\[[^]]*\]\[[^]]*\]$' file > new_file
输出:
[xxxx][xxxx]
[xxxx][xxxx]
[xxxx][xxxx]
答案2
如果您grep
支持-o
,并且没有其他[
就行,那么您想要第一个之后的所有内容[
:
$ grep -oP '[^]]*\K\[.*' file
[xxxx][xxxx]
[xxxx][xxxx]
[xxxx][xxxx]
如果您可以拥有其他[
您不想要的,请尝试:
$ grep -oP '.*\K\[.+?\]\[.*' file
[xxxx][xxxx]
[xxxx][xxxx]
[xxxx][xxxx]
如果你没有grep
支持-o
(我相信macOS 就可以), 您可以使用:
$ sed -E 's/.*(\[.+?\]\[.*)/\1/' file
[xxxx][xxxx]
[xxxx][xxxx]
[xxxx][xxxx]
答案3
POSIX sed:
sed 's/.*\(\[[^]]*\]\[[^]]*\]\)$/\1/' file
\[[^]]*\]
匹配[
、任意数量的非]
、另一个]
。\(\[[^]]*\]\[[^]]*\]\)$
匹配其中两个,锚定在行尾,由\(\)
第一个也是唯一的捕获组捕获。\1
仅捕获的组保留在输出中。