基本上我有文本文件,我想替换多行中的行
我正在使用此代码
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';
答案 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
与下一个}
之间的所有行。如果}
后面的行为空,则也会将其删除。