Regex 如何在perl sed中跳过像find/replace命令这样的非匹配项?

Regex 如何在perl sed中跳过像find/replace命令这样的非匹配项?,regex,perl,sed,Regex,Perl,Sed,给出这个简单的sed命令: echo "abc\nxyz" | sed "s/abc/***/" 等效的Perl版本是 echo "abc\nxyz" | perl -pe "s/abc/***/" Sed只允许输出匹配行,如下所示: echo "abc\nxyz" | sed -n "s/abc/***/p" while( <> ) { # Your code goes here... } continue { print; } while( <&g

给出这个简单的sed命令:

echo "abc\nxyz" | sed "s/abc/***/"
等效的Perl版本是

echo "abc\nxyz" | perl -pe "s/abc/***/" 
Sed只允许输出匹配行,如下所示:

echo "abc\nxyz" | sed -n "s/abc/***/p"
while( <> ) {
    # Your code goes here...
}
continue {
    print;
}
while( <> ) {
    # Your code goes here....
}
如何使用Perl实现这一点


仅供参考,我想使用Perl的正则表达式引擎,它似乎比sed功能更全面,但我想要这个sed选项。

Perl的
-p
选项意味着对输入的每一行执行
-e…
操作,然后打印。更改为
-n
意味着读取文件的每一行,并在每一行上执行
-e…
。因此,实现您想要的目标的简单方法如下:

echo "abc\nxyz" | perl -ne "print if s/abc/***/"

在Perl中,
-p
开关设置一个隐式循环,该循环在输入上进行迭代,并在每次循环迭代后打印
$\ucode>的内容。Perl还有一个
-n
开关,它要求隐式循环中的代码处理自己的输出:

echo“abc\nxyz”| perl-ne's/abc/***/&print'

中介绍了
-p
-n
开关

简言之,
-p
形成了一个隐式循环,看起来像这样:

echo "abc\nxyz" | sed -n "s/abc/***/p"
while( <> ) {
    # Your code goes here...
}
continue {
    print;
}
while( <> ) {
    # Your code goes here....
}

因此,使用
-n
,您必须明确指定何时生成输出,以及输出应该是什么。通过重新获得对输出的控制,您可以合并逻辑,使“打印”仅在满足某些条件时发生,例如正则表达式匹配。在我的示例中,如果匹配成功,我们将使用逻辑短路来触发打印。

Try
sed
从外部,从内部!谢谢这个答案也行得通,但我只能接受一个。这是
perl-p
的糟糕表现,它逐行读取输入文件,并
打印它们,无论它们是否被代码修改。“打印每次转换的结果”是错误的。@Borodin澄清了前两句话。