如何在sed中的正则表达式中包含新行搜索

时间:2014-01-24 07:02:28

标签: regex linux sed

基本上我有文本文件,我想替换多行中的行

我正在使用此代码

sed -rn ':a;N;$!ba;s/if(.*):://gp' file.txt

基本上我将所有行放入内存然后搜索模式。

我希望(.*)匹配新行,但它没有这样做。我做错了什么

修改

这是文件

<?php

if (!isset($_SERVER['HTTP_HOST'])) {
    exit('This script cannot be run from the CLI. Run it from a browser.');
}

if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
    '127.0.0.1',
    '::1',
))) {
    header('HTTP/1.0 403 Forbidden');
    exit('This script is only accessible from localhost:: .');
}

require_once dirname(__FILE__).'/../app/SymfonyRequirements.php';

我想删除require_once and if(!in_array)

之前的内容

reuire_once不应该用作匹配,因为它可以在其他文件中有所不同

输出

<?php

if (!isset($_SERVER['HTTP_HOST'])) {
    exit('This script cannot be run from the CLI. Run it from a browser.');
}

require_once dirname(__FILE__).'/../app/SymfonyRequirements.php';

4 个答案:

答案 0 :(得分:2)

如果要删除的文本范围内没有空行,则可以使用更简单的awk命令:

> cat file.php
<?php

if (!isset($_SERVER['HTTP_HOST'])) {
       exit('This script cannot be run from the CLI. Run it from a browser.');
}

if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
       '127.0.0.1',
           '::1',
           ))) {
       header('HTTP/1.0 403 Forbidden');
           exit('This script is only accessible from localhost:: .');
}
require_once dirname(__FILE__).'/../app/SymfonyRequirements.php';

> awk '{sub(/if *\( *!in_array.*require_once/, "require_once")}1' RS= file.php

输出

<?php
if (!isset($_SERVER['HTTP_HOST'])) {
       exit('This script cannot be run from the CLI. Run it from a browser.');
}
require_once dirname(__FILE__).'/../app/SymfonyRequirements.php';

更新:这是一个gnu-awk版本,也可以使用空行:

awk '{sub(/if *\( *!in_array.*/, "") }1' RS='\n\n' file

答案 1 :(得分:1)

使用GNU sed,您可以说:

sed -e '/./{H;$!d;}' -e 'x;/::/d' filename

[这使用了代码块之间有换行符这一事实。]

说明:

  • /./匹配非空白行。
  • H将这些附加到保留缓冲区。
  • $!d会导致仅在最后打印这些内容。
  • 一旦遇到空行,第二部分就会开始。
  • x用模式空间交换保持缓冲区。
  • /::/d如果模式与::匹配,则会将其删除。

如果不是这样,你可以说:

sed -e :a -e '/if/,/}/ {/}/!{ $!{N;ba};};/::/d;}' filename

答案 2 :(得分:1)

 sed -rn ':a;N;$!ba;s/if(.){0,5}in_array.*?}//gp' file.txt
<?php

if (!isset($_SERVER['HTTP_HOST'])) {
    exit('This script cannot be run from the CLI. Run it from a browser.');
}



require_once dirname(__FILE__).'/../app/SymfonyRequirements.php';

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed '/if\s*(\s*!in_array/,/}/{/}/!d;$!N;/\n.*\S/D;d}' file

这会删除if ( !in_array与下一个}之间的所有行。如果}后面的行为空,则也会将其删除。