我有很多大的文本文件,它们被已知的分隔符{}分割成一组。如果一个块包含某个序列,比如xyq,那么我想输出整个块。
我知道我可以写一个grep来获取搜索标记,但如何将我的选择扩展到最接近的括号?
注意,{和}可以位于任何位置,即不是行首或行尾、空白,。。。
寻找这样的东西:

Input:
 {i am a turtle}
 {i am a horse}
 {i am a programmer}

grep ???programmer??? ./File

output: {i am a programmer}

最佳答案

你可以先把这些新词翻译成别的东西。假设输入没有nul,这是一个很好的候选者。

cat input | tr '\n' '\0' | grep -aEo '\{.*?programmer.*?\}' | tr '\0' '\n'

在regexp本身中,?使前面的匹配不贪婪,这意味着它们匹配尽可能短的序列而不是最长的序列。请注意,如果搜索词可能出现在大括号之外,则这将无法正常工作,您需要获得更明确的信息:
cat input | tr '\n' '\0' | grep -aEo '\{[^{}]*programmer[^{}]*\}' | tr '\0' '\n'

关于regex - 在Linux中根据其内容输出文本块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10609421/

10-13 09:07