首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.gsub(/\./,"").gsub(/\(/,"").gsub(/\)/,"").gsub(/\localhost/,"") <=

.gsub(/\./,"").gsub(/\(/,"").gsub(/\)/,"").gsub(/\localhost/,"") <=
EN

Stack Overflow用户
提问于 2015-12-24 20:29:38
回答 3查看 158关注 0票数 1

我正在编写一个程序,它将从who命令中提取信息并格式化输出。

正常的who命令:

代码语言:javascript
复制
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)

我对who命令的新看法是:

代码语言:javascript
复制
user
user
user
user
user
user
user
user
user
user
user

为了做到这一点,我必须使用gsub和其他一些东西完全删除数字,整行如下所示:

代码语言:javascript
复制
`who`.gsub!(/\d+/, "").gsub!(/\..../, "").gsub!(/\(/, "").gsub(/\Dec/, "").gsub(/\:/, "").gsub(/\pts/, "").gsub(/\//, "").gsub(/\./, "").gsub(/\)/, "").gsub(/\localhost/, "").gsub(/\Nov/, "").squeeze(" ").strip

有没有更好的方法来编写这个正则表达式没有所有这些gsub的?

编辑:

可接受答案的更新who输出:puts `who`.gsub(/[ \t].*/,"")

输出现在如下所示:

代码语言:javascript
复制
John
Jim
Jake
Steve
Josh
Eric
etc..
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-24 20:34:07

这里有三种方法。首先,尝试users命令。:)

第二:

代码语言:javascript
复制
 who | sed -e 's/[ \t].*//g'

第三:

代码语言:javascript
复制
 puts `who`.gsub(/[ \t].*/,"")

这三种方法都要短得多,也简单得多。

票数 3
EN

Stack Overflow用户

发布于 2015-12-24 20:35:38

没有正则表达式怎么样?

代码语言:javascript
复制
users = `who`.each_line.map do |line|
    line.split.first
end

或者,如果这是整个实用程序,它可能只是:

代码语言:javascript
复制
who | awk '{ print $1 }'

@DavidHoelzer是对的,请使用users。=)

票数 3
EN

Stack Overflow用户

发布于 2015-12-24 22:25:13

我经常看到的一件事是,人们希望通过删除不属于自己的东西来提取信息,而不是简单地获取他们想要的东西。拿你想要的东西比删除你不想要的东西要快,特别是在处理大量文本的时候,它会产生更容易遵循的代码。

如果我想用一行中的第一个单词,我想要所有的东西都到第一个空格。很容易就能抓到:

代码语言:javascript
复制
who_out = <<EOT
user1 tty7        2012-08-07 05:33 (:0)
user2 192.168.0.1 2012-08-07 06:47 (:0.0)
user3 127.0.0.1   2012-08-07 07:58 (:0.0)
EOT

who_out.lines.map{ |l| l[/^\S+/] }     # => ["user1", "user2", "user3"]
who_out.lines.map{ |l| l[/\A\S+/] }    # => ["user1", "user2", "user3"]
who_out.scan(/^\S+/)                   # => ["user1", "user2", "user3"]
who_out.scan(/^\w+/)                   # => ["user1", "user2", "user3"]
who_out.lines.map{ |l| l.split.first } # => ["user1", "user2", "user3"]

前两个查找行的开头(^\A),并将所有非空白(\S+)的内容返回到第一个空白。

scan查找行开始(^),并在每一行中找到相同的第一个空格。\w[a-zA-Z0-9_]相匹配,这几乎就是我们想要的用户名,因为它们通常是大写和小写字符加上数字和_

最后一个问题应该很容易理解。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34457653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档