shell regexp(sed)抑制“不匹配”输出

whhtz7ly  于 2023-08-07  发布在  Shell
关注(0)|答案(2)|浏览(124)

我被困在那里,无法理解:我如何告诉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真的是我应该使用的工具吗?我想从干草堆中取出一根针,我想要一根针或什么都不想要。

5uzkadbs

5uzkadbs1#

默认情况下,sed打印所有行。
您要执行的操作是:

/patt/!d;s//repl/

字符串
换句话说,删除与您模式不匹配行,对于匹配行,从中提取特定元素,例如给出捕获组编号在您的情况下,它将是:

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


您也可以使用-n选项来抑制回显所有行。则仅当您显式声明该行时才会打印该行实际上,使用-n的脚本通常更长,维护起来也更麻烦。它将在这里:

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


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

vuv7lop3

vuv7lop32#

可以使用egrep -o吗?
input.txt:

blooody
aaaa
bbbb
odor
qqqq

字符串
例如:

sehe@meerkat:/tmp$ egrep -o o+ input.txt 
ooo
o
o
sehe@meerkat:/tmp$ egrep -no o+ input.txt 
1:ooo
4:o
4:o


当然egrep会有稍微不同的(更好?)高级构造的正则表达式语法(反向引用、非贪婪运算符)。如果你喜欢这种方式,我会让你做翻译。

相关问题