Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

In less, can you search using / for a pattern that contains a carriage return and newline? I know your pattern can end with a line using $ (from How do I include newlines in a search in less?), but I need the pattern to match text that spans multiple lines.

I tried \n, but that only searches for the n character.

share|improve this question
    
Have you tried \n+ for 1 or more newlines? –  Brock Hensley Jan 17 '14 at 1:45
    
Which Linux distribution, and do you have defined the environment variable "LESS" ? –  harrymc Feb 23 at 12:59
    
@harrymc How would that help with multiline search? –  sashoalm Feb 25 at 18:54
    
Gathering information. –  harrymc Feb 25 at 19:29
1  
This is not possible, based on a review of the source code for less (search.c:search_range()). The search/match operation is performed on a single newline-delimited line at a time, so you cannot match across line boundaries. See line.c:forw_raw_line() for the implementation of "readline" as called by search_range. –  zackse Feb 26 at 5:50

3 Answers 3

less is using ed regex syntax and it does not support multiline matching unfortunately.

https://www.gnu.org/software/gnulib/manual/html_node/ed-regular-expression-syntax.html#ed-regular-expression-syntax

I was hoping to find that as well, or at least find if this syntax bit was used in less:

RE_DOT_NEWLINE If this bit is set, then the match-any-character operator matches a newline; if this bit isn’t set, then it doesn’t.

So I can use .+ pattern to match newlines. But no, it doesn't.

share|improve this answer

It is not possible to match across line boundaries, because the search function in less operates on a single newline-delimited line at a time. This is the case regardless of the system regex implementation (GNU, POSIX, PCRE, etc.).

Please note that I couldn't find an official source repository for the mainline development of less, but for purposes of code review here, the links that follow are from the FreeBSD contrib tree.

See search.c:search_range() for the implementation of the search operation. The loop therein calls line.c:forw_raw_line() to retrieve the next newline-delimited block of content. That block is passed to match.c:match_pattern() where the search pattern (regular expression) is executed.

To match across multiple lines, you'll need to use a different tool. One option is to drop into your editor and use its search capabilities as suggested by others. You can invoke the editor by pressing v in less.

share|improve this answer

Not sure how to do it in less, but you can accomplish the same in vim.

http://vim.wikia.com/wiki/Search_across_multiple_lines

/PATTERN1\\_.\\{-}PATTERN2

The atom \\_. finds any character including end-of-line. The multi \\{-} matches as few as possible.

share|improve this answer
1  
This does not answer the question, however, since it is about less, not vim. It should be a comment. –  sashoalm Feb 22 at 6:47
    
@sashoalm It's still an attempt to answer, so I'd vote it down, and move on. People searching for a solution may not be bound to use one tool specifically. –  slhck Feb 22 at 13:50

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.