2014-12-04 117 views
3

可能排除不正确的说法,但我说的是使用Lua的string.find下列()函数:LUA模式,排除不符合字符串的结尾工作

[^exclude] 

一点也没有如果字符后面没有任何内容,IE似乎不起作用,IE是字符串中的最后一个字符。

更具体地说,我得到一个进程正在运行的列表,并试图在LUA内部解析它们。

[email protected]:/# ps | grep mpd 
5427 root  21620 S mpd /etc/mpd2.conf 
5437 root  25660 S mpd 

这不会是一个问题,如果我可以指望每次\ n,但有时ps不会列出自己造成这个问题。我想匹配:

5437 root  25660 S mpd 

从这我会提取一个kill命令的PID。我运行的OpenWRT构建不支持正则表达式或killall上的确切选项,否则我只是这样做。

(%d+ root%s+%d+ S%s+mpd[^ ]) 

上述模式不起作用。这是因为在我认为的最后一行中的最后一个字符之后没有字符。我也试过这些:

(%d+ root%s+%d+ S%s+mpd$) 

上面的模式返回nil。

(%d+ root%s+%d+ S%s+mpd[^ ]?) 

上面的图案返回第一个进程(5427)

也许有一个更好的方式去了解这一点,或者只是一个简单的模式改变我可以得到它的工作,但我可以似乎找不到一个只能抓住正确流程的人。我不能脱离PID或VSZ,因为它们是可变的。也许我必须看看能否以更好的killall支持来编译OpenWRT。

无论如何,感谢您花时间阅读本文,如果这是重复的,我很抱歉,但我找不到类似于我的困境的任何东西。任何建议,非常感谢!

+0

是否可以使用'pgrep'?它可能有帮助。但'''模式应该匹配。你有什么循环代码来完成比赛? – 2014-12-04 21:15:44

+0

我有pgrep,似乎没有工作。它返回两个mpd进程。我所拥有的代码只是一个javascript按钮,它将http post发送到我的openwrt路由器,它具有基于发布数据的LUA交互。所以它本质上只是一个杀死mpd的按钮,但我不想杀mpd /etc/mpd2.conf,因为这是一个音乐流,我只想杀死本地播放器。我甚至没有用它来测试,但我只是交互式地运行我的路由器运行LUA。 – 2014-12-04 21:23:31

回答

4

鉴于:

local s = [[5427 root  21620 S mpd /etc/mpd2.conf 
5437 root  25660 S mpd]] 

以下图案

string.match(s,"(%d+)%s+root%s+%d+%s+S%s+mpd[%s]-$") 

回报: 5437根25660小号MPD

而此:

string.match(s,"(%d+%s+root%s+%d+%s+S%s+mpd[%s]%p?[%w%p]+)") 

返回s:

5427 root 21620 s mpd /etc/mpd2.conf

+0

这个伎俩!非常感谢你的帮助!如果我试图理解为什么它看起来是[%s] - 意味着0或1的空格,但不确定[]是什么,而$表示行结束。 – 2014-12-04 23:01:00