我被困在那里,无法理解:我如何告诉sed返回找到的值,否则闭嘴?
这真的超出了我的能力范围:如果sed什么都没有找到,为什么要返回整个字符串?我必须对返回的字符串运行 * 另一个 * 测试来验证它吗?我尝试使用手册页(非常短)中的“-n”,但它有效地抑制了所有输出,包括匹配的字符串。
这就是我现在所拥有的:
echo plop-02-plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/'
字符串
它返回02
(这很好,非常感谢),但是:
echo plop-02plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/'
型
返回plop-02plop
(当它应该返回this =“”nothing!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
$
型
最后一个我甚至不能相信。sed
真的是我应该使用的工具吗?我想从干草堆中取出一根针,我想要一根针或什么都不想要。
2条答案
按热度按时间5uzkadbs1#
默认情况下,
sed
打印所有行。您要执行的操作是:
字符串
换句话说,删除与您模式不匹配行,对于匹配行,从中提取特定元素,例如给出捕获组编号在您的情况下,它将是:
型
您也可以使用
-n
选项来抑制回显所有行。则仅当您显式声明该行时才会打印该行实际上,使用-n
的脚本通常更长,维护起来也更麻烦。它将在这里:型
还有
grep
,但您的示例说明了为什么sed
有时更好。vuv7lop32#
可以使用
egrep -o
吗?input.txt:
字符串
例如:
型
当然
egrep
会有稍微不同的(更好?)高级构造的正则表达式语法(反向引用、非贪婪运算符)。如果你喜欢这种方式,我会让你做翻译。