regexp(sed)suppress";“不匹配”;输出

regexp(sed)suppress";“不匹配”;输出,regex,bash,shell,sed,Regex,Bash,Shell,Sed,我被这件事缠住了,想都不敢想:我怎么能告诉sed返回找到的值,否则闭嘴 我真的无法理解:如果塞德什么也没找到,他为什么要归还整根绳子?我是否必须对返回的字符串运行另一个测试来验证它?我尝试使用(非常短的)手册页中的“-n”,但它有效地抑制了所有输出,包括匹配的字符串 这就是我现在拥有的: echo plop-02-plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/' 返回 02(很好,非常感谢),但是: 返回 plop-02plop(当它应该返回t

我被这件事缠住了,想都不敢想:我怎么能告诉sed返回找到的值,否则闭嘴

我真的无法理解:如果塞德什么也没找到,他为什么要归还整根绳子?我是否必须对返回的字符串运行另一个测试来验证它?我尝试使用(非常短的)手册页中的“-n”,但它有效地抑制了所有输出,包括匹配的字符串

这就是我现在拥有的:

echo plop-02-plop | sed -e 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/'
返回
02
(很好,非常感谢),但是:

返回
plop-02plop
(当它应该返回this=“nothing!当,你发现什么都没有,所以请安静! 谢谢你大声呼喊!!)

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

$ 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
真的是我应该使用的工具吗?我想从干草堆中提取一根针,我想要一根针或者什么都不要。

默认情况下,sed打印所有行

你想做的是

/patt/!d;s//repl/
low删除与您的模式不匹配的行,如果它们匹配,则从中提取特定元素,例如给出捕获组号。在您的情况下,它将是:

sed -e '/^.*\(.\)\([0-9][0-9]\)\1.*$/!d;s//\2/'
sed -ne 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/p'
您还可以使用
-n
选项抑制所有行的回音。然后,仅当您显式声明该行时,才会打印该行。实际上,使用
-n
的脚本通常比较长,维护起来也比较麻烦。这将是:

sed -e '/^.*\(.\)\([0-9][0-9]\)\1.*$/!d;s//\2/'
sed -ne 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/p'

还有grep,但您的示例说明了为什么sed有时更好。

也许您可以使用
egrep-o

input.txt:

blooody
aaaa
bbbb
odor
qqqq
例如


当然,
egrep
对于高级构造(反向引用、非贪婪运算符)将有稍微不同的(更好的?)regex语法。如果您喜欢这种方法,我会让您进行翻译。

正如您所发现的,
sed
正在按照您的要求进行翻译;它是一个流编辑器,将其输入打印到脚本修改后的输出。您的不匹配案例没有更改数据,因此所回显的是您的输入-这是
sed
的正确行为。抑制输出的答案是使用
-n
,然后当你想要打印东西时,添加一个显式的
p
。我会被诅咒的,它是有效的。非常感谢,先生@谢谢,我会检查grep。您可以将
-n
版本缩短为:
sed-ne的/^.\(.9][0-9]\\1.*$/\2/p'
,这比没有
-n
@Jonathan的版本短。您完全正确。在这种特殊情况下,
-n
确实更短。我本来应该按照你一开始的建议写
-n
,但不知怎的,我忘了。相当尴尬@Jonathan@przemoc,你会怎么做才能得到相反的结果?返回的字符串没有匹配的位?@xaccrocher Remove
在我的样板文件中(也可能是
s//
命令;取决于是否要进一步修改它)。对于
-n
它将是
/patt/!p