我使用以下命令在一组文件夹中的文件中搜索文本:
# 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,即打开结果中的所有文件。为了实现这一目标,我应该在命令的最后添加什么?我认为解决方案涉及将结果分成&#34;:&#34; (注意空格)并使用第一部分,我已尝试用awk执行此操作但无法管理它。
谢谢,最大
答案 0 :(得分:1)
您可以在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
为每个输入文件重置,因此给出了正确的行号。
line 1
new_pupil_group_form blah blah blah
line 2
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
答案 1 :(得分:1)
您可能希望首先使用冒号分隔字符串作为分隔符 然后从你想要的输入组成:
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
答案 2 :(得分:1)
这个怎么样:
geany $(find . -type f -exec grep -Hn -m1 new_pupil {} \; | awk -F: '{print $1":"$2}')