我在尝试实现此bash命令时遇到问题:
连接当前目录中的所有文本文件,这些文件在文件的文本中至少出现一次单词BOB
(无论如何)。
使用cat
命令然后使用grep
找到单词BOB
的出现位置对我来说是否正确?
cat grep -i [BOB] *.txt > catFile.txt
答案 0 :(得分:5)
正确处理带有空格字符的文件名:
grep --null -l -i "BOB" *.txt | xargs -0 cat > catFile.txt
答案 1 :(得分:2)
您的问题是需要将<?xml version="1.0" encoding="UTF-8"?>
<graphml>
<graph id="G" edgedefault="directed">
<node id="n0"/>
<node id="n1"/>
<node id="n2">
<graph id="n2::" edgedefault="directed">
<node id="n2::n0"/>
<node id="n2::n1">
<graph id="n2::n1::" edgedefault="directed">
<node id="n2::n1::n0"/>
<node id="n2::n1::n1"/>
<node id="n2::n1::n2"/>
<edge id="e0" source="n2::n1::n1" target="n2::n1::n0"/>
<edge id="e1" source="n2::n1::n2" target="n2::n1::n1"/>
</graph>
</node>
<node id="n2::n2"/>
<edge id="e2" source="n2::n1" target="n2::n0"/>
<edge id="e3" source="n2::n2" target="n2::n1"/>
</graph>
</node>
<edge id="e4" source="n1" target="n0"/>
<edge id="e5" source="n1" target="n2::n1"/>
<edge id="e6" source="n0" target="n2"/>
</graph>
</graphml>
的文件名作为内联函数传递给grep
:
cat
cat $(grep --null -l -i "BOB" *.txt ) > catFile.txt
处理内联执行$(.....)
仅返回匹配的内容的文件名答案 2 :(得分:1)
您可以将find
与-exec
:
find -maxdepth 1 -name '*.txt' -exec grep -qi 'bob' {} \; \
-exec cat {} + > catFile.txt
-maxdepth 1
确保您不会搜索比当前目录更深的内容-name '*.txt'
说要查看以.txt
结尾的所有文件 - 对于目录以.txt
结尾的情况,您可以添加{ {1}}仅查看文件-type f
为找到的每个-exec grep -qi 'bob' {} \;
文件运行grep。如果文件中有.txt
,则退出状态为零,并执行下一个指令。 bob
确保grep是静默的。-q
在包含-exec cat {} +
cat
答案 3 :(得分:0)
您需要删除方括号......
grep -il "BOB" *
答案 4 :(得分:0)
You can also use the following command that you must run from the directory containing your BOB
files.
grep -il BOB *.in | xargs cat > BOB_concat.out
-i
is an option used to set grep
in case insensitive mode
-l
will be used to output only the filename containing the pattern provided as argument to grep*.in
is used to find all the input files in the dir (should be adapted to your folder content) xargs
in order to build the arguments that cat will use to produce your file concatenation. HYPOTHESIS: