寻找有条件的模式

寻找有条件的模式

我有一个巨大的文件,我想在其中查找单词,例如pattern。我试图用一个例子来说明我的情况。

假设我的文件中某处有

Sample-pattern="abc"

我想编写一个脚本来回显Sampleabc字符之前的单词和引号内的单词

所以如果有

Sample2-pattern="xyz"

它会回响Sample2并且xyz

pattern请注意,该文件中的其他位置可能存在该单词。但如果该单词pattern前面有除连字符以外的任何内容,则脚本应忽略它。例如,如果有

Sample3pattern.....

它应该忽略它。

答案1

有输入file.txt

Sample-pattern="abc"
Sample2-pattern="xyz"
Sample3pattern="def"

以下sed脚本将产生以下输出:

$ sed -E -n -e '/-pattern/ s/^([^-]*)-[^=]*="([^"]*)"/\1 \2/p' file.txt
Sample abc
Sample2 xyz

上面的脚本sed打印一行中第一个字符之前的所有文本,以及一行中-第一个字符之后双引号内的所有文本。=它不会打印与正则表达式不匹配的行(两者 -/-pattern/地址规范以及s///搜索和替换)。

注意:它使用-E选项sed来启用扩展正则表达式。这适用于 GNU、*BSD、Mac OS X 和其他一些版本的....它比 GNU-ish选项sed更好用, GNU-ish选项可以做同样的事情,但在 Mac OS X 版本的. 很可能在不久的将来成为 POSIX 标准。-E-rsed-E

基本正则表达式版本是:

sed -n -e '/-pattern/ s/^\([^-]*\)-[^=]*="\([^"]*\)"/\1 \2/p'

答案2

如果您有权访问 GNU grep(Linux 上的默认设置),您可以执行以下操作:

grep -Po '\w+-pattern="[^"]+' file

启用-E扩展正则表达式,它\S可以匹配任何非空白字符。使得仅-o打印grep该行的匹配部分。正则表达式本身查找一个或多个非空格字符 ( \S+),然后-pattern="查找一个或多个非"字符 ( [^"]+)。因此,给出一个这样的文件:

$ cat file
Sample-pattern="abc"
Sample2-pattern="xyz"
Sample3pattern="foo"

grep命令将返回:

$ grep -Eo '\S+-pattern="[^"]+' file 
Sample-pattern="abc
Sample2-pattern="xyz

然后你可以通过它来sed删除-pattern="

$ grep -Eo '\S+-pattern="[^"]+' file | sed 's/-pattern="/ /'
Sample abc
Sample2 xyz

相关内容