SED和Reg Exp

时间:2017-02-13 11:19:45

标签: regex sed

我想打印以" if($ EN)"开头的区域(多于一行)并以"?>"结束 我想使用sed - 但我可以使用其他解决方案

第一种方法:

cat modal_27001.inc.php |  sed -n '/if/,/?>/p'

正在运作,但也提供了从例如if($ ABC)

以下正在工作,我不知道为什么

cat modal_27001.inc.php |  sed -n '/if\(\$EN\)/,/?>/p'

有人可以告诉我为什么吗?

感谢rob

编辑: 这是一个简短的测试文件 我想提取前8行(但并不总是前8行)

<?php
   if ($EN) {
    echo "Watschnpladdla Wurscht Vergeltsgott gscheckate ";                             
    echo "Bua pfenningguat Semmlkneedl";                            
    echo "Blosmusi heitzdog nia Edlweiss Sauakraud";                            
    echo "Milli, des is schee i mechad ";                           
   }
   ?>
<?php
   if ($BCD) {
    echo "Hemad san Servas. Großherzig gscheckate";                             
    echo "Jodler Kuaschwanz wiavui,";                           
    echo "Watschnbaam resch Sauwedda, i mog di";                            
    echo "Brotzeit Guglhupf sammawiedaguad ";                           
   }
   ?>
<?php
echo "02397450923754ß3258764ß95867"
?>

结果应该是

   if ($EN) {
    echo "Watschnpladdla Wurscht Vergeltsgott gscheckate ";                             
    echo "Bua pfenningguat Semmlkneedl";                            
    echo "Blosmusi heitzdog nia Edlweiss Sauakraud";                            
    echo "Milli, des is schee i mechad ";                           
   }
 ?>

甚至更好:

<?php
   if ($EN) {
    echo "Watschnpladdla Wurscht Vergeltsgott gscheckate ";                             
    echo "Bua pfenningguat Semmlkneedl";                            
    echo "Blosmusi heitzdog nia Edlweiss Sauakraud";                            
    echo "Milli, des is schee i mechad ";                           
   }
 ?>

2 个答案:

答案 0 :(得分:0)

  

我假设您只想打印您的比赛,因为您说:我想打印区域(多于一行)

首先是这个正则表达式:

if(?:\s+)?(\$EN).*?\?>

可以匹配你想要的。
但是如果你想打印它,我对 sed 知之甚少,但我仍然可以用 Perl

解决这个问题

说你有这个文件:

if ($BCD) {
    echo "Hemad san Servas. Großherzig gscheckate";                             
    echo "Jodler Kuaschwanz wiavui,";                           
    echo "Watschnbaam resch Sauwedda, i mog di";                            
    echo "Brotzeit Guglhupf sammawiedaguad ";                           
   }
   ?>
<?php
echo "02397450923754ß3258764ß95867"
?>
<?php
   if ($EN) {
    echo "Watschnpladdla Wurscht Vergeltsgott gscheckate ";                             
    echo "Bua pfenningguat Semmlkneedl";                            
    echo "Blosmusi heitzdog nia Edlweiss Sauakraud";                            
    echo "Milli, des is schee i mechad ";                           
   }
   ?>
if ($BCD) {
    echo "Hemad san Servas. Großherzig gscheckate";                             
    echo "Jodler Kuaschwanz wiavui,";                           
    echo "Watschnbaam resch Sauwedda, i mog di";                            
    echo "Brotzeit Guglhupf sammawiedaguad ";                           
   }
   ?>
<?php
echo "02397450923754ß3258764ß95867"
?>
<?php
   if ($EN) {
    echo "Watschnpladdla Wurscht Vergeltsgott gscheckate ";                             
    echo "Bua pfenningguat Semmlkneedl";                            
    echo "Blosmusi heitzdog nia Edlweiss Sauakraud";                            
    echo "Milli, des is schee i mechad ";                           
   }
   ?>
<?php
   if ($BCD) {
    echo "Hemad san Servas. Großherzig gscheckate";                             
    echo "Jodler Kuaschwanz wiavui,";                           
    echo "Watschnbaam resch Sauwedda, i mog di";                            
    echo "Brotzeit Guglhupf sammawiedaguad ";                           
   }
   ?>
<?php
echo "02397450923754ß3258764ß95867"
?>   

您的图案有多个匹配,如果您只想一次,只需打印即可 perl -lne ' $/=undef;/\s+if(?:\s+)?\(\$EN\).*?\?\>/s && print $&' file

输出

    if ($EN) {
    echo "Watschnpladdla Wurscht Vergeltsgott gscheckate ";                             
    echo "Bua pfenningguat Semmlkneedl";                            
    echo "Blosmusi heitzdog nia Edlweiss Sauakraud";                            
    echo "Milli, des is schee i mechad ";                           
   }
   ?>

或多次:
perl -lne ' $/=undef; print $& while /\s+if(?:\s+)?\(\$EN\).*?\?\>/gs' file

输出

    if ($EN) {
    echo "Watschnpladdla Wurscht Vergeltsgott gscheckate ";                             
    echo "Bua pfenningguat Semmlkneedl";                            
    echo "Blosmusi heitzdog nia Edlweiss Sauakraud";                            
    echo "Milli, des is schee i mechad ";                           
   }
   ?>

    if ($EN) {
    echo "Watschnpladdla Wurscht Vergeltsgott gscheckate ";                             
    echo "Bua pfenningguat Semmlkneedl";                            
    echo "Blosmusi heitzdog nia Edlweiss Sauakraud";                            
    echo "Milli, des is schee i mechad ";                           
   }
   ?>  

也适合你的

  

更好

perl -lne ' $/=undef; print $& while /\<\?php(?:\s+)?if(?:\s+)?\(\$EN\).+?\?\>/gs' file  

输出

<?php
   if ($EN) {
    echo "Watschnpladdla Wurscht Vergeltsgott gscheckate ";                             
    echo "Bua pfenningguat Semmlkneedl";                            
    echo "Blosmusi heitzdog nia Edlweiss Sauakraud";                            
    echo "Milli, des is schee i mechad ";                           
   }
   ?>
<?php
   if ($EN) {
    echo "Watschnpladdla Wurscht Vergeltsgott gscheckate ";                             
    echo "Bua pfenningguat Semmlkneedl";                            
    echo "Blosmusi heitzdog nia Edlweiss Sauakraud";                            
    echo "Milli, des is schee i mechad ";                           
   }
   ?>

证明

enter image description here

答案 1 :(得分:0)

在许多sed方言中,反斜杠括号。

另外,cat is useless

sed -n '/if(\$EN)/,/?>/p' modal_27001.inc.php

许多sed方言也有-E-r这样的选项来启用扩展(又称“现代”)正则表达式,但这究竟是什么意思以及调用的选项取决于关于sed的版本。