如何只将输出解析为是或否所有其余的忽略?

时间:2012-03-19 11:14:46

标签: linux perl bash

我怎样才能通过跳过任何内容来输出是或否?

$ pactl list sources | grep -A 6 "Name: alsa_input.usb.analog-mono" | tail -n 1 | perl -p -i -e 's/.+\\s(yes|no)$/$1/'


Mute: no

仅限于展示:no

4 个答案:

答案 0 :(得分:2)

perl -M5.010 -ne 'say $1 if m/\s(yes|no)$/i'

答案 1 :(得分:2)

您的perl表达式已损坏。观察:

$ echo "Mute: no" | perl -p -i -e 's/.+\\s(yes|no)$//'
Mute: no

它没有做任何事情!它没有做任何事情的原因是因为没有什么是匹配的。为什么不?因为您不必要地转义了\s。正确的表达式应为s/.+\s(yes|no)$/$1/。请注意\之前的单s

使用这个新表达式,我们得到:

$ echo "Mute: no" | perl -p -i -e 's/.+\s(yes|no)$/$1/'
no
$ echo "Mute: yes" | perl -p -i -e 's/.+\s(yes|no)$/$1/'
yes

请注意,这仍然无法执行您想要的操作,因为如果没有匹配,则整行将按原样发出。例如:

$ echo "Mute: monkies" | perl -p -e 's/.+\s(yes|no)$/$1/'
Mute: monkies

虽然这可能通过更复杂的正则表达式来解决,但我不会这样做。相反,我会引用以下内容:

  

有时当人们看到问题时,他们会自己想“我   知道,我会使用正则表达式。“现在他们有两个问题。

答案 2 :(得分:2)

这有效:

LANG=C pactl list sources | perl -0 -lne'print $1 if /Name: alsa_input.usb.analog-mono\n(?:\N+\n){5}\s+Mute: (yes|no)/ms'

但是你需要正确地解析这个问题,你不能依赖于静音线总是在6行之后。

答案 3 :(得分:1)

从perl的角度来看:

perl -p -i -e 's/.+\\s(yes|no)$/$1/is'

请插入原始输入以及您希望获得什么(预期输出)