我怎样才能通过滑动输出是或否?如何仅将输出解析为是或否,其余的都忽略?
$ 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
只有INSEAD显示:no
我怎样才能通过滑动输出是或否?如何仅将输出解析为是或否,其余的都忽略?
$ 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
只有INSEAD显示:no
你表达式被破坏。注意:
$ 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
虽然这可以用更复杂的正则表达式解决,但我不会这样做。相反,我会引用以下内容:
有时候当人们看到一个问题时,他们认为自己“我知道我会用 ,我会用正则表达式。”现在他们有两个问题。
从Perl的观点:
perl -p -i -e 's/.+\\s(yes|no)$/$1/is'
请插入原始输入和你想要什么achive(预期输出)
这工作:
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行总是来。
仅显示“静音:否”而不是“否”。 – YumYumYum 2012-03-19 11:21:38