我怎样才能通过跳过任何内容来输出是或否?
$ 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
答案 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'
请插入原始输入以及您希望获得什么(预期输出)