2012-03-19 30 views

回答

2

你表达式被破坏。注意:

$ 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 

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

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

1

从Perl的观点:

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

请插入原始输入和你想要什么achive(预期输出)

+0

仅显示“静音:否”而不是“否”。 – YumYumYum 2012-03-19 11:21:38

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

无法打开perl脚本“如果m/\ s(是|否)$/i”说$ 1:没有这样的文件或目录 – YumYumYum 2012-03-19 11:21:11

+0

@YumYumYum,作为管道的一部分,'-i'没有任何意义,否则它将交换机的'e''部分作为扩展名吸收,因此它不会将下一个参数识别为代码。 – Axeman 2012-03-19 11:39:26

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行总是来。