![寻找有条件的模式](https://linux22.com/image/86863/%E5%AF%BB%E6%89%BE%E6%9C%89%E6%9D%A1%E4%BB%B6%E7%9A%84%E6%A8%A1%E5%BC%8F.png)
我有一个巨大的文件,我想在其中查找单词,例如pattern
。我试图用一个例子来说明我的情况。
假设我的文件中某处有
Sample-pattern="abc"
我想编写一个脚本来回显Sample
连abc
字符之前的单词和引号内的单词
所以如果有
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
-r
sed
-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