regexp(sed)抑制"不匹配"输出

yPh*_*hil 19 regex bash shell sed

我坚持下去并且无法绕过它:我怎么能告诉sed返回找到的值,否则闭嘴

这真的超出了我:如果他找不到任何东西,为什么sed会返回整个字符串?我是否必须对返回的字符串运行另一个测试以验证它?我尝试在(非常短的)手册页中使用"-n",但它有效地抑制了所有输出,包括匹配的字符串.

这就是我现在拥有的:

echo plop-02-plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/'
Run Code Online (Sandbox Code Playgroud)

返回 02(这很好,花花公子,非常感谢),但是:

echo plop-02plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/'
Run Code Online (Sandbox Code Playgroud)

返回 plop-02plop(当它应该返回这个="" 什么都没有!Dang,你什么都没发现所以安静!大声喊叫!)

我尝试检查返回值,但这也失败了!喘气!!

$ echo plop-02-plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/' ; echo $?
02
0
$ echo plop-02plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/' ; echo $?
plop-02plop
0
$
Run Code Online (Sandbox Code Playgroud)

最后一个我甚至不敢相信.是sed真的,我应该使用的工具?我想从大海捞针中取出一根针,我想要针还是什么

prz*_*moc 25

sed默认打印所有行.

你想做的是

/patt/!d;s//repl/
Run Code Online (Sandbox Code Playgroud)

IOW删除与您的模式不匹配的行,如果它们匹配,则从中提取特定元素,例如给出捕获组编号.在你的情况下,它将是:

sed -e '/^.*\(.\)\([0-9][0-9]\)\1.*$/!d;s//\2/'
Run Code Online (Sandbox Code Playgroud)

您还可以使用-n选项来抑制回显所有行.然后只有在您明确说明行时才打印行.在实践中,使用脚本-n通常更长并且维护起来更麻烦.这将是:

sed -ne 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/p'
Run Code Online (Sandbox Code Playgroud)

还有grep,但你的例子显示,为什么sed有时更好.