Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅在pattern1和pattern2在连续行中匹配时grep_Grep - Fatal编程技术网

如何仅在pattern1和pattern2在连续行中匹配时grep

如何仅在pattern1和pattern2在连续行中匹配时grep,grep,Grep,我有一个如下的文件: city-italy good food bad climate - city-india bad food normal climate - city-brussel normal dressing stylish cookings good food - 问题-我想grep城市和食品,因为“食品”是“坏的” 例如— 对于上面的问题,我需要一个grep命令来得到如下的答案 city-india bad food 请帮助我,如果模式1和模式2并行成功,我将如何使它们变灰

我有一个如下的文件:

city-italy
good food
bad climate
-
city-india
bad food
normal climate
-
city-brussel
normal dressing
stylish cookings
good food
-
问题-我想grep
城市
食品
,因为“食品”是“坏的”

例如— 对于上面的问题,我需要一个grep命令来得到如下的答案

city-india
bad food
请帮助我,如果模式1和模式2并行成功,我将如何使它们变灰


我的意思是这两种模式都应该匹配,并且应该在下面的行中grep。

你可以使用管道--
grep-A1城市| grep-B1“坏食物”
cat filename | grep-A1城市| grep-B1“坏食物”
(或管道的任何其他流源)

使用
gnu awk
(到期日)

另一条awk线:

kent$  awk 'BEGIN{FS=OFS="\n";RS="-"FS}/bad food/{print $1,$2}' file
city-india
bad food

如果保证城市名称在食品质量之前(允许在两者之间提供任何其他信息):


它将每个城市的名称保留在保留缓冲区中,并在匹配坏食物时打印最后的城市名称。

如果顺序得到保证,您可以直接使用命令
grep
,或:

grep -e "city" -e "food" FILE_INPUT
然后,希望这座城市在接下来的几天里也能看到它的美食特色

结果如下:

city-italy
good food
city-india
bad food
city-brussel
good food

您可以更改模式以获得更过滤的结果。

我知道这是一个老问题,但这里有一个“可靠”的替代方案(因为我喜欢):


解释
  • grep-x-e'city-.'-e'good food'-e'bad food'-e'-'
    :只保留包含“city line”、“food line”(好的或坏的)或“separator line”(我知道food line表达式可能更好),grep的
    -x
    参数将使其仅在整行与给定表达式匹配时返回一行(顺便说一句,此第一阶段使整个管道不会阻塞在不同大小的“寄存器”上)

  • tr\\n\|
    :将换行符转换为管道(您可以使用原始文件中未出现的任何字符,管道工作,冒号也工作,您明白了)

  • sed-e的/|-|/\n/g'
    :用换行符替换
    -|-|
    字符串(这是我们知道的“寄存器”结束的地方,因为我们只保留了我们感兴趣的基准和分隔符,我们知道现在我们的每个“寄存器”都在一行中,它们的字段由管道分隔)

  • grep-xe'[^ |]\+\+[^ |]\+'
    :只保留恰好包含两个字段(即城市和食品字段)的行

  • grep-e'| bad food$'
    :仅保留以
    |bad food
    结尾的行

  • tr\|\\n
    :将管道重新转换为新线(注意,这里的内容只是为了使输出符合问题的规格,我认为这不是真正需要的,也不是首选)

  • 部分输出 在grep-x-e'city-.'-e'good food'-e'bad food'-e'-e'之后

    city-italy
    good food
    -
    city-india
    bad food
    -
    city-brussel
    good food
    -
    
    tr\\n\|
    之后:

    city-italy|good food|-|city-india|bad food|-|city-brussel|good food|-|
    
    sed-e的/|-|/\n/g'
    之后:

    city-italy|good food
    city-india|bad food
    city-brussel|good food
    
    grep-xe'[^ |]\+\+.[^ |]\+'
    之后:同上,因为在给定的示例中,我们没有没有没有没有“食物线”的“城市线”,也没有包含两条“城市线”和一条“食物线”的寄存器,也没有包含一条“城市线”和两条“食物线”的寄存器,或者……你明白了

    grep-e'|坏食物$'之后

    city-india|bad food
    
    tr\|\\n
    之后:

    city-india
    bad food
    
    为什么这更“健壮”? 输入文件基本上由不同的“寄存器”组成,每个寄存器包含可变数量的“字段”,但我们发现它们不是“水平”格式,而是“垂直”格式,即每行一个字段,单独的
    -
    分隔整个寄存器

    上面的管道支持每个寄存器中的任意数量的字段,它仅假设:

  • 寄存器由一个单独的
    -
    分隔

  • “城市字段”的格式均为
    city-*

  • “食品领域”要么是
    好食品
    ,要么是
    坏食品

  • 如果存在的话,“城市”字段出现在“食物”字段之前

  • (我发现最后一个特别难以放松,至少在一个“正常”的管道中是如此)

    我不不假设:

  • 每个登记册都有一个“城市”和一个“食品”字段

  • 每个登记册只有“城市”和“食品”字段

  • 免责声明 我并不是说这比其他任何答案都好,只是我不能用
    sed
    awk
    来拯救我自己的生命,而且经常发现这样的管道有助于理解文件是如何被过滤和转换的


    总而言之,这只是一个品味问题。

    很好的一个,展示了两种可能性。注意,您可以避免使用
    grep-A1 city filename
    cat
    部分。
    city-italy|good food
    city-india|bad food
    city-brussel|good food
    
    city-india|bad food
    
    city-india
    bad food