我使用以下命令搜索一组文件夹中的文件中的文本:
# 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'这一切都很好:我得到了这样的结果,这正是我想要看到的。
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),然后打开它,使该行聚焦:
geany app/views/cmw/pupil_groups/index.html.erb:65有时我想把我的搜索结果都传递给geany (打开结果中的所有文件)。为了实现这一点,我应该在我的命令的末尾加上什么呢?我认为解决方案包括将结果分割到":“(请注意空格)并使用第一部分,我尝试过使用awk,但无法管理它。
谢谢,麦克斯
发布于 2014-04-16 10:17:11
你可以在awk上做这个
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
line 1
new_pupil_group_form blah blah blah
line 2公共/javascripts/c
line 1
line 2
new_pupil_group_form
line 4命令
geany public/javascripts/a:2 public/javascripts/c:3您可以通过稍微修改脚本来再现原始行为:
find public/javascripts/ -type f -exec awk '/new_pupil_group_form/ && length($0) < 400 { print FILENAME":"FNR": "$0}' {} \;输出
public/javascripts/a:2: new_pupil_group_form blah blah blah
public/javascripts/c:3: new_pupil_group_form 发布于 2014-04-16 10:20:21
您可能希望首先使用冒号分隔字符串,然后将所需的输入组成:
echo "foo:25: bar " | awk -F ':' '{print $1":"$2}'将打印
foo:25所以完整的命令是:
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发布于 2014-04-16 10:26:56
这个怎么样:
geany $(find . -type f -exec grep -Hn -m1 new_pupil {} \; | awk -F: '{print $1":"$2}')https://stackoverflow.com/questions/23105984
复制相似问题