首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对":“命令的拆分结果,并使用第一部分调用程序。

对":“命令的拆分结果,并使用第一部分调用程序。
EN

Stack Overflow用户
提问于 2014-04-16 09:55:38
回答 3查看 114关注 0票数 2

我使用以下命令搜索一组文件夹中的文件中的文本:

代码语言:javascript
复制
#    get a list of files     get the contents           find the search string and        don't show any results
#                                                           print the line number          where the line is more than 400 chars
#          |                        |                             |                               |
#          v                        v                             v                               v
find app public/javascripts | awk '{print "\""$0"\""}' |xargs grep -n "new_pupil_group_form" | awk 'length($0) < 400'

这一切都很好:我得到了这样的结果,这正是我想要看到的。

代码语言:javascript
复制
app/views/cmw/pupil_groups/index.html.erb:65:  <%= render :partial => "cmw/pupil_groups/new_pupil_group_form" %>
app/views/cmw/pupil_groups/edit.html.erb:52:  <%= render :partial => "cmw/pupil_groups/new_pupil_group_form" %>
app/views/cmw/pupil_groups/create.js.rjs:9:  page.replace_html "modal-new-class", :partial => "cmw/pupil_groups/new_pupil_group_form"  
app/views/pupil_groups/_class_modals.html.erb:2:  <%= render :partial => "cmw/pupil_groups/new_pupil_group_form" %>

我喜欢获得行号,因为我可以用文件和行号调用我喜欢的文本编辑器(geany),然后打开它,使该行聚焦:

代码语言:javascript
复制
geany app/views/cmw/pupil_groups/index.html.erb:65

有时我想把我的搜索结果都传递给geany (打开结果中的所有文件)。为了实现这一点,我应该在我的命令的末尾加上什么呢?我认为解决方案包括将结果分割到":“(请注意空格)并使用第一部分,我尝试过使用awk,但无法管理它。

谢谢,麦克斯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-16 10:17:11

你可以在awk上做这个

代码语言:javascript
复制
geany $(find public/javascripts/ -type f -exec awk '/new_pupil_group_form/ && length($0) < 400 { printf FILENAME":"FNR" "}' {} \;)

这将匹配包含new_pupil_group_form的所有行和上面的长度< 400,并打印它们。我使用的是printf,所以输出都在一行上。FNR为每个输入文件重置,以便给出正确的行号。

公共/javascripts/a

代码语言:javascript
复制
line 1
new_pupil_group_form blah blah blah
line 2

公共/javascripts/c

代码语言:javascript
复制
line 1
line 2
new_pupil_group_form
line 4

命令

代码语言:javascript
复制
geany public/javascripts/a:2 public/javascripts/c:3

您可以通过稍微修改脚本来再现原始行为:

代码语言:javascript
复制
find public/javascripts/ -type f -exec awk '/new_pupil_group_form/ && length($0) < 400 { print FILENAME":"FNR": "$0}' {} \;

输出

代码语言:javascript
复制
public/javascripts/a:2: new_pupil_group_form blah blah blah
public/javascripts/c:3: new_pupil_group_form 
票数 1
EN

Stack Overflow用户

发布于 2014-04-16 10:20:21

您可能希望首先使用冒号分隔字符串,然后将所需的输入组成:

代码语言:javascript
复制
echo "foo:25: bar " | awk -F ':' '{print $1":"$2}'

将打印

代码语言:javascript
复制
foo:25

所以完整的命令是:

代码语言:javascript
复制
find app public/javascripts | awk '{print "\""$0"\""}' |xargs grep -n "new_pupil_group_form" | awk 'length($0) < 400' | awk -F ':' '{print $1":"$2}'  | xargs geany
票数 1
EN

Stack Overflow用户

发布于 2014-04-16 10:26:56

这个怎么样:

代码语言:javascript
复制
geany $(find . -type f -exec grep -Hn -m1 new_pupil {} \; | awk -F: '{print $1":"$2}')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23105984

复制
相关文章

相似问题

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