grep 所有以某个字符开头并以另一个字符结尾的字符串

grep 所有以某个字符开头并以另一个字符结尾的字符串

我需要 grep 所有以“[”开头并以某个字符串结尾的字符串,例如“apal”。因此这两个字符之间的所有字符也会显示。给定一个输入,例如:

[44060]apal223reaea[55000]opoer4nr4on[95749]assad fdfdf Bhassrj sdaapald33qdq3d3da3ded[66000]dsfsldfsfldkj[77000]porpo4o4o3j3mlkfxxxx[101335]KaMMMM MMM lapa[131322]sadasds ddd apaladsdas[138133]sadasdadasddsss KMMapaldsadsadwe[150000]idhoqijdoiwjodwiejdw

输出会是谎言

[44060]apal
[95749]assad fdfdf Bhassrj sdaapal
[101335]KaMMMM MMM lapal
[131322]sadasds ddd apal
[138133]sadasdadasddsss KMMapal

答案1

使用:

grep -o '\[.*apal' file.txt

替换file.txt为实际文件名。

另一方面,如果您想[在行的开头进行匹配:

grep -o '^\[.*apal' file.txt

答案2

尝试:

grep -o '^\[.*apal$' file.txt

匹配正则表达式的命令:.......usegrep
来匹配仅有的编写的正则表达式, ........use-o
要匹配行的开头, .................use ^^\[
要匹配之间的任何字符, .use ..*
要匹配行尾,......................请使用$apal$
包含要匹配内容的文件。:file.txt

答案3

最好使用 sed,而不是使用 grep。

sed 's/.*\(X.*Y\)/\1/p' < file.txt

将 X 替换为起始模式,将 Y 替换为结束模式。该命令将所有与 X 到 Y 匹配的内容放入 sed 的缓冲区 1 中。替换模式中的“\1”将打印该缓冲区。

所以,在你的例子中:

sed 's/.*\(\[.*apal\)/\1/p' < file.txt

应该可以解决问题。

答案4

[如果您只想要和之间的文本apal,perl 是一个不错的选择

perl -lne '/(?<=\[)(.+?)(?=apal)/ and print $1' file

如果您安装了 GNU grep(例如通过自制程序),您可以

grep -Po '(?<=\[).+?(?=apal)' file

相关内容