.gsub(/ \ … /,“”)。worub(/ \(/,“”)。gsub(/ \)/,“”)。gsub(/ \ localhost /,“”)<=这是少数

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

正常who命令:

 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命令的新看法:

 user user user user user user user user user user user 

为了做到这一点,我不得不用gsub和其他一些东西完全删除数字,整行看起来像这样:

 `who`.gsub!(/\d+/, "").gsub!(/\..../, "").gsub!(/\(/, "").gsub(/\Dec/, "").gsub(/\:/, "").gsub(/\pts/, "").gsub(/\//, "").gsub(/\./, "").gsub(/\)/, "").gsub(/\localhost/, "").gsub(/\Nov/, "").squeeze(" ").strip 

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

编辑:

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

输出现在看起来像这样:

 John Jim Jake Steve Josh Eric etc.. 

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

第二:

  who | sed -e 's/[ \t].*//g' 

第三:

  puts `who`.gsub(/[ \t].*/,"") 

这三个都短得多,简单得多。

没有正则表达式怎么样?

 users = `who`.each_line.map do |line| line.split.first end 

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

 who | awk '{ print $1 }' 

@DavidHoelzer是对的; 使用users 。 =)

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

如果我想在一行中取第一个单词,我希望一切都达到第一个空格。 抓住这个很容易:

 who_out = < ["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_] ,这大约是我们想要的用户名,因为它们通常是大写和小写字符加上数字和_

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