How to give a pattern for new line in grep?

前端 未结 6 584
予麋鹿
予麋鹿 2020-12-02 06:19

How to give a pattern for new line in grep? New line at beginning, new line at end. Not the regular expression way. Something like \\n.

相关标签:
6条回答
  • 2020-12-02 06:27

    try pcregrep instead of regular grep:

    pcregrep -M "pattern1.*\n.*pattern2" filename
    

    the -M option allows it to match across multiple lines, so you can search for newlines as \n.

    0 讨论(0)
  • 2020-12-02 06:28

    As for the workaround (without using non-portable -P), you can temporary replace a new-line character with the different one and change it back, e.g.:

    grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
    

    Basically it's looking for exact match _foo_ where _ means \n (so __ = \n\n). You don't have to translate it back by tr '_' '\n', as each pattern would be printed in the new line anyway, so removing _ is enough.

    0 讨论(0)
  • 2020-12-02 06:31

    You can use this way...

    grep -P '^\s$' file
    
    • -P is used for Perl regular expressions (an extension to POSIX grep).
    • \s match the white space characters; if followed by *, it matches an empty line also.
    • ^ matches the beginning of the line. $ matches the end of the line.
    0 讨论(0)
  • 2020-12-02 06:33

    grep patterns are matched against individual lines so there is no way for a pattern to match a newline found in the input.

    However you can find empty lines like this:

    grep '^$' file
    grep '^[[:space:]]*$' file # include white spaces 
    
    0 讨论(0)
  • 2020-12-02 06:38

    Thanks to @jarno I know about the -z option and I found out that when using GNU grep with the -P option, matching against \n is possible. :)

    Example:

    grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

    Prints bar

    0 讨论(0)
  • 2020-12-02 06:43

    just found

    grep $'\r'
    

    It's using $'\r' for c-style escape in Bash.

    in this article

    0 讨论(0)
提交回复
热议问题