如何从每个句子中提取最后带有 [xxx][xxxx] 模式的模式

如何从每个句子中提取最后带有 [xxx][xxxx] 模式的模式

我有一个包含这样句子的文件:

..........[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仅捕获的组保留在输出中。

相关内容