是否存在可以从文件中特定的一组行中删除一行的正则表达式,Perl或sed?

时间:2018-07-25 17:41:42

标签: regex perl sed sublimetext regex-lookarounds

例如,如果我有类似的东西:

public function store(Request $request) {

 $request = $request->all();
 $new = App\Model::create($request);
 $new->save();

 if ( Request comming from url or route x ) {
     return redirect()->back();
 } else {
      return redirect()->route('route');
   }

我想删除让我们说的墙并保留其他行,我该如何使用regex进行操作,还是有比regex更好的选择?

所以我需要它看起来像:

<Mansions \>
 windows
 walls
 floors
<\Mansions>

,在我移除墙壁后,上方的线条仍将存在。因此,目标是在文件中搜索这些行组,并删除一个单词,而仍然保留其他单词在该行中以及该组中。

请记住,我只是在更改文件中的该组,而不是更改文件中单词的实例,因为那样会更简单。

我尝试使用正则表达式:

<Mansions \>
 windows
 floors
<\Mansions>

但是当我删除单个单词(如walls)时,这不起作用

那么是否可以将正则表达式用于类似这样的事情?

5 个答案:

答案 0 :(得分:1)

这是一个Perl单行代码,它使用触发器运算符( public static List<Order> AllOrders(string customerId) { var orderlist = new List<Order>();   if (Order!=null && Order.Count>0) { if (Order.TryGetValue(customerId, out orderlist)) return orderlist; } return FromDB(customerId); } )仅对两个正则表达式匹配中的文本进行操作。如果它与..匹配并且在开始和结束文本之内,则会跳过该行。

/wall/

答案 1 :(得分:1)

$ awk '/<\\Mansions>/{f=0} f && /walls/{next} /<Mansions \\>/{f=1} 1' file
<Mansions \>
 windows
 floors
<\Mansions>

以上内容可在任何UNIX盒中的任何shell中使用任何awk进行工作。

答案 2 :(得分:0)

在Perl中,您可以尝试以下操作:

use feature qw(say);
use strict;
use warnings;

my $str = '
<Mansions \>
 walls
 windows
 floors
<\Mansions>';

my $word = 'walls';

$str =~ s/^(\s*<Mansions\s*\\>)(.*?)(<\\Mansions>)/do_replace($1, $2, $3, $word)/mseg;

say $str;

sub do_replace {
    my ( $header, $group, $closer, $word ) = @_;
    $header. ($group =~ s/\n?^\s*\Q$word\E\s*$//mr) . $closer;
}

输出

<Mansions \>
 windows
 floors
<\Mansions>

答案 3 :(得分:0)

如果这些组没有相互分组,则可以使用sed脚本:

脚本.sed

/<Mansions \\>/,/<\\Mansions>/ {
    /^[[:blank:]]*walls[[:blank:]]*$/ d
}

您可以像sed -Ef script.sed yourfile一样运行它。

说明

  • /<Mansions \\>/,/<\\Mansions>/ { ... }注意内部表达式仅应用于<Mansions \><\Mansions>之间的行。如果将Mansion组合在其他Mansion中,则此方法将无效。
  • /^[[:blank:]]*walls[[:blank:]]*$/ ...选择包含单词walls并带有可选的前导和尾随空格的行。
  • d意味着删除这些行。

答案 4 :(得分:0)

为什么要加倍努力?如前所述,您的问题不需要任何代码或正则表达式,也不需要纯粹的香草查找和替换功能。如果您的问题中还有其他地方需要代码答案,那么我找不到它。

  1. 打开“查找并替换”。
  2. Find中使用此:

    <Mansions \> windows walls floors <\Mansions>

  3. Replace中使用此:

    <Mansions \> windows floors <\Mansions>

  4. 单击Replace All

任务完成。