首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用egrep和awk在两种模式之间获取文本

用egrep和awk在两种模式之间获取文本
EN

Stack Overflow用户
提问于 2015-12-04 23:58:11
回答 1查看 116关注 0票数 2

我试图解析命令的帮助文件,以获取命令例外的所有参数。

下面是帮助文件中的一些文本:

代码语言:javascript
复制
* --digest:
  Set the digest for fingerprinting (defaults to the digest used when
  signing the cert). Valid values depends on your openssl and openssl ruby
  extension version.

* --debug:
  Enable full debugging.

* --help:
  Print this help message

* --verbose:
  Enable verbosity.

* --version:
  Print the puppet version number

我只想抓住--argument什么都不想。

我几乎可以用这个命令得到它,但它仍然包括":“,我想排除它:

代码语言:javascript
复制
puppet cert --help | egrep '^* --(.*):$' | awk '{print $2}'
--all:
--allow-dns-alt-names:
--digest:
--debug:
--help:
--verbose:
--version:

为什么'^* --(.*):$'包括":“,它不应该匹配'^* --'':$'之间的所有内容吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-05 00:06:23

它不是应该匹配^* --:$之间的所有东西吗?

实际上,不是。你正在捕捉一个组,但它不会只打印这个组。我建议使用-P标志来使用Perl,并查看四周。在你的例子中,这可能就足够了:

代码语言:javascript
复制
$ cert --help | grep -Po '^\* \K--\w+'

注意,我还使用了-o选项,只打印匹配的内容,而不是整行。这就消除了awk的使用。

根据你最初的想法和更多的周遭观察,你会发现一条更完整的线条:

代码语言:javascript
复制
$ cert --help | grep -Po '^\* \K--.*(?=:)'

编辑:正如mklement0在注释和详细答复中所指出的,这需要grep。但是,您也可以对Perl本身执行同样的操作,Perl很可能已经安装在您的系统中了。

代码语言:javascript
复制
$ cert --help | perl -nle 'print $1 if /^\* (--\w+)/'

这就像循环中的一行代码。它由-nle自动生成。-n用于输入外观,-l用于自动换行,-e用于表示代码行。

如果该行与regex匹配,Perl代码行将打印第一个捕获的组。因此,它也结合了你原来的解决方案的想法。

要获得完整的符合POSIX标准的答案,请查看本页中的answer by mklement0

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34099480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档