gpt4 book ai didi

regexp (sed) 抑制 "no match"输出

转载 作者:行者123 更新时间:2023-11-29 08:45:24 25 4
gpt4 key购买 nike

我被困在这个问题上,无法解决这个问题:我如何告诉 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 时!该死,你什么也没找到所以保持安静! 为了大声哭泣!!)

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

$ 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/

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

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

您还可以使用 -n 选项来禁止回显所有行。然后仅当您明确声明时才会打印行。在实践中,使用 -n 的脚本通常更长,维护起来也更麻烦。这将是:

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

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

关于regexp (sed) 抑制 "no match"输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6011661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com