【问题标题】:printing "grep -o" output in single line在单行中打印“grep -o”输出
【发布时间】:2016-08-30 23:13:34
【问题描述】:

如何在一行中打印grep -o 的输出?我正在尝试打印:

$ echo "Hello Guys!" |grep -E '[A-Z]'
Hello Guys!
$ echo "Hello Guys!" |grep -Eo '[A-Z]' <----Multiple lines
H
G
$ echo "Hello Guys!" |grep -Eo '[A-Z]'

期望的输出:

HG

我可以使用以下命令廉价地实现它,但问题是字母数量(在这种情况下为 3 个)可能是动态的。所以不能使用这种方法。

echo "HEllo Guys!" |grep -oE  '[A-Z]' |xargs -L3 |sed 's/ //g'
HEG

【问题讨论】:

  • 这就是 -o 所做的定义 ---> Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line
  • 可以使用 sed。 echo "Hello Guys!" |sed 's/[^A-Z]//g'
  • @123,谢谢。您的解决方案对我有用。
  • 虽然不能使用 perl ..
  • @user5584716 怎么会?

标签: linux bash sed grep xargs


【解决方案1】:

你可以用这个 sed 指令来做这一切

echo "Hello Guys!" |sed 's/[^A-Z]//g'

更新

sed 命令分解:

s///sed 的替代命令。它只是将第一个正则表达式(第一个和第二个斜线之间的那个)替换为斜线二和三之间的表达式。尾随的 g 代表全局,即对当前行中 RegEx 的每个匹配项都执行此操作。如果没有 g,它只会在第一次匹配后停止处理。 RegEx 本身匹配任何非大写字母,然后将这些字母替换为空,即有效删除。

【讨论】:

  • 我本来打算发这个的,但它的局限性在于你只能用它来匹配单个字符,对于单词来说会变得更加复杂。
  • @123 老实说,我发帖时没有看到您的评论,并不是要窃取您的想法。无论如何,OP没有说他想匹配整个单词。只是大写字母的数量可能会有所不同。
  • 谢谢你的解释,我假设“^”表示否定,对吗?
  • @user5584716 正确,括号内的“^”(字符类)表示否定。在字符类之外,它标志着行的开始。
【解决方案2】:

你可以使用awk

echo "Hello Guys!" | awk '{ gsub(/[^A-Z]/,"", $0); print;}'
HG

还有 tr

echo "Hello Guys!" | tr -cd [:upper:]
HG

还有 sed

echo "Hello Guys!" | sed 's/[^\[:upper:]]//g'
HG

【讨论】:

  • 这也会将提示留在同一行。
  • 我没有得到你的评论
  • 它不会留下尾随换行符,因此提示将在字符串之后立即开始。
  • 我用 tr 给出了另一个答案
【解决方案3】:

您只需要删除换行符。您可以为此使用tr

echo "HEllo Guys!" |grep -Eo '[A-Z]' |tr -d '\n'
HEG

不过,它也会删除最后一个换行符。

【讨论】:

  • @monk 那是因为最后一个换行符也被剪切了,即输出和下一个命令提示符之间没有换行符。
【解决方案4】:

你可以用 perl 代替 grep

echo 'HEllo Guys!' | perl -lne 'print /([A-Z])/g' 
HEG

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多