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有时更好.