【问题标题】:How to remove last character from grep output?如何从 grep 输出中删除最后一个字符?
【发布时间】:2014-11-17 15:01:53
【问题描述】:

我有一个包含以下内容的文本文件(例如):

In first line the "One", second"Two " & " Three " and also"Four    ". 
In second line also nested "foo "bar" baz""zoo" patterns.

我尝试将所有字符串都放在一对引号之间,最后我得到了这个命令:

grep -Po '"\K[^"]+"' file

这个命令给我的如下:

One"
Two "
 Three "
Four    "
foo "
 baz"
zoo"

我想要的 来自上述结果,因为我想要的输出将是:

One
Two 
 Three 
Four    
foo 
 baz
zoo

请有人帮我从上面的grep 输出中删除最后一个"。我不想从输出中删除空格。我没有任何扩展到多行的单词。例如:

... "foo "bar" ba
z""zoo" ...

拜托,请不要建议我可以使用多个命令,我知道我可以。我问你我是否可以单独使用 grep 及其选项来做到这一点?

【问题讨论】:

  • 但是正则表达式匹配是贪婪的,所以只搜索 [^"]+ 没有尾随 " 应该就足够了,不是吗?

标签: grep text-processing


【解决方案1】:

这可以通过下面的 grep one-liner 来实现。

$ grep -oP '"\K[^"]+(?="(?:[^"]*"[^"]*")*[^"]*$)' file
One
Two 
 Three 
Four    
foo 
 baz
zoo

另一个通过PCRE动词(*SKIP)(*F)的hacky,

$ grep -oP '[^"]+(?=(?:"[^"]*"[^"]*)*[^"]*$)(*SKIP)(*F)|[^"]+' file
One
Two 
 Three 
Four    
foo 
 baz
zoo

【讨论】:

    【解决方案2】:

    如果你不能用grep解决的话,这里是awk

    awk -F\" '{for (i=2;i<=NF;i+=2) {gsub(/ /,"");print $i}}' file
    One
    Two
    Three
    Four
    foo
    baz
    zoo
    

    awk -F\" '{for (i=2;i<=NF;i+=2) print $i}'
    One
    Two
     Three
    Four
    foo
     baz
    zoo
    

    【讨论】:

    • @KasiyA 并非所有问题都可以通过grep 轻松解决。你没有awk吗?
    猜你喜欢
    • 2011-07-01
    • 2012-09-21
    • 2021-05-10
    • 2023-04-06
    • 2020-03-12
    • 2021-12-11
    • 2011-11-18
    • 2013-09-12
    • 1970-01-01
    相关资源
    最近更新 更多