我怎么能只通过跳过任何东西来输出yes或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仅限欧洲工商管理学院展览:no
发布于 2012-03-19 19:21:19
您的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虽然这可能可以用一个更复杂的正则表达式来解决,但我不会这样做。相反,我将引用以下内容:
有时,当人们看到问题时,他们会想:“我知道,我会使用正则表达式。”现在他们有两个问题。
发布于 2012-03-19 19:18:30
perl -M5.010 -ne 'say $1 if m/\s(yes|no)$/i'发布于 2012-03-19 19:31:57
这是可行的:
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行之后出现。
https://stackoverflow.com/questions/9769149
复制相似问题