如何在文件中搜索文本而忽略换行符?


11

我想搜索文件中可能分成几行的文本。一个grep,它将忽略换行符并返回匹配的行距。

例如,我将搜索is an example file,并希望在以下文件中找到它:

这是
一个
示例文件。

不要依赖前导或尾随空格,最好完全忽略所有形式的空格(最好将空格的任何序列都视为一个空格)。


一种非理想的解决方案是tr '\n' ' ' | grep,它区分匹配和不匹配,但不显示匹配项,也不能很好地处理大文件。


关于SO(没有明确的答案):stackoverflow.com/q/1858312/1449460
Nikana Reklawyks

isearch-forward
顺便提一下

Vim也是如此:/This\_sis。有关更多详细信息::help \_s
lcd047

在搜索行的末尾添加此行:tr -n“ \ n”这将删除所有新行。希望有帮助!
丹·豪威尔

Answers:


12

GNU grep可以做到

grep -z 'is\san\sexample\sfile.' file

为了满足注释中出现的一些观点,对脚本进行了一些修改:

 grep -oz '^[^\n]*\bis\s*an\s*example\s*file\.[^\n]*' file

关于大文件,我对存储空间的限制没有想象力,但是在出现问题的情况下,您可以自由使用 sed

sed '/\bis\b/{
          :1
          N
          /file\.\|\(\n.*\)\{3\}/!b1
         }
     /\<is\s*an\s*example\s*file\./p
     D' file

在内存(\(\n.*\)\{3\})中最多保留4行(因为模式中有4个字)。


5
如您所知,该-z选项告诉grep您将换行符视为普通文本字符,并寻找nul字节来分隔记录。在没有nul字节的文本文件中(即典型情况),grep -z会将整个文件视为一行。因此,(1)提出了如何处理大文件的问题,(2)如果找到匹配项,它将写出整个文件,不提供有关匹配位置的线索。另外(3)OP说,“理想情况下,将任何空白序列都视为一个空格,”因此您应该使用\s+和添加-E
G-Man说'恢复莫妮卡'

1
@ G-Man谢谢您的评论。请参阅编辑后的答案。
哥斯达黎加

1
(0)啊,-o; 我一直忘了那个。聪明的使用方式。(1)您的新grep答案开始^[\n]*;这是的错字[^\n]*。(2)我\s+故意说。  be\s*little将匹配belittle,并且care\s*less将匹配careless。但是我想这是一个小问题。而且,如果你不想使用-E,可以使用的“穷人的版本” \s+,即\s\s*。(3)好sed命令。如果有空行,它可能会失败(因此,四个单词的短语可以分布在四行以上);我能够通过添加来解决此问题s/\n\s*\n/\n/
G-Man说'恢复莫妮卡'

@ G-Man再次感谢您。您的评论非常有用。我试图发布或多或少的可移植代码,因为著名成员每次都会促使我这样做。无论如何,即使没有-E你的钢能够使用+\s\+形式。模式内的空行似乎是人为的。
哥斯达黎加

我当时在想分页的文本文档,例如RFC(ISTR),手册页在某些系统上(或确实在),但是,进一步想想,我发现大多数此类文档都具有页眉和/或页脚(s),在您希望grep他们输入短语之前,需要先删除它们。
G-Man说'恢复莫妮卡'

7

尝试这个:

pcregrep -M '\bThis\s+is\b' <<EOT
This
is
an example
file.
EOT

\s如果我搜索“这是一个非常长的模式”,是否必须键入5次?
Nikana Reklawyks 2015年

1
是:点是\s匹配空格,换行符是“空格”。
lcd047

我的意思是,如果文件是This\nis a very\nlong pattern,该怎么办?我不知道可能在哪里出现换行符。我必须搜索This\sis\sa\svery\slong\spattern,对吗?(随着图案长度的增加或从其他位置粘贴而变得乏味)
Nikana Reklawyks

2
然后,您可以这样操作:pcregrep -M "$( echo 'This is a very long pattern' | sed 's/ /\\s+/g' )" file
lcd047
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.