![如何在文件中搜索文本而忽略换行符?](https://linux22.com/image/65241/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%96%87%E4%BB%B6%E4%B8%AD%E6%90%9C%E7%B4%A2%E6%96%87%E6%9C%AC%E8%80%8C%E5%BF%BD%E7%95%A5%E6%8D%A2%E8%A1%8C%E7%AC%A6%EF%BC%9F.png)
我想搜索文件中可能分为多行的文本。一个 grep 会忽略换行符并返回匹配的行范围。
例如,我将搜索is an example file
,并期望在以下文件中找到它:
这是
一个
示例文件。
不依赖于前导空格或尾随空格,完全忽略所有形式的空格可能是最好的(理想情况下,将任何空格序列视为单个空格)。
一种非理想的解决方案是tr '\n' ' ' | grep
,它区分匹配和不匹配,但不显示匹配,也不能很好地处理大文件。
答案1
GNUgrep
可以做到
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
内存中保留不超过 4 行(因为模式中有 4 个单词)( \(\n.*\)\{3\}
)。
答案2
尝试这个:
pcregrep -M '\bThis\s+is\b' <<EOT
This
is
an example
file.
EOT