lua模式,排除在字符串末尾不起作用。

也许排除不是正确的术语,但我正在谈论在lua的string.find()函数中使用以下内容:

[^ exclude]

如果字符后面没有跟随任何内容,即是字符串中的最后一个字符,它似乎无法工作。

更具体地说,我正在获取运行的进程列表,并尝试在LUA内部解析它们。

root@OpenWrt:/# ps | grep mpd
 5427 root     21620 S    mpd /etc/mpd2.conf
 5437 root     25660 S    mpd

如果我每次都能期望一个\n,那么这将不成问题,但有时ps不会列出它本身,从而创建此问题。我想要匹配:

5437 root     25660 S    mpd

从此中我将提取PID以进行kill命令。我正在运行一个不支持regex或killall确切选项的OpenWRT构建,否则我只需这样做即可。

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

上述模式不起作用,不幸的是。我认为这是因为最后一行的最后一个字符后面没有字符。我还尝试过这些:

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

上述模式返回零。

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

上述模式返回第一个进程(5427)

也许有更好的方法来解决这个问题,或者只需要对模式进行简单的更改即可使其起作用,但我似乎找不到仅获取正确进程的方法。我无法依靠PID或VSZ,因为它们是变量。也许我必须看看是否可以编译具有更好killall支持的OpenWRT。

无论如何,感谢您抽出时间阅读此内容,如果这是重复的,我很抱歉,但我找不到类似我的困境的任何事情。任何建议都将不胜感激!

点赞
用户1058509
用户1058509
local s = [[5427 root     21620 S    mpd /etc/mpd2.conf
5437 root     25660 S    mpd]]

下面的 pattern:

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

返回值为: 5437 root 25660 S mpd

然而下面的 pattern:

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

返回值为:

5427 root 21620 S mpd /etc/mpd2.conf

2014-12-04 22:31:24