Bash 使用命令管道作为diff的参数

Bash 使用命令管道作为diff的参数,bash,grep,diff,Bash,Grep,Diff,我在这个简单的任务中遇到了问题: cat file | grep -E ^[0-9]+$ > file_grep diff file file_grep 问题是,我想在没有file\u grep 我试过: diff file `cat file | grep -E ^[0-9]+$` 及 还有一些其他的组合:-)但我不能让它工作。 当diff得到额外的参数时,我总是得到一个错误,该参数是由grep过滤的文件内容 当我想在这样的脚本中echo命令输出时(使用backtick转义),类似的

我在这个简单的任务中遇到了问题:

cat file | grep -E ^[0-9]+$ > file_grep
diff file file_grep
问题是,我想在没有
file\u grep

我试过:

diff file `cat file | grep -E ^[0-9]+$`

还有一些其他的组合:-)但我不能让它工作。 当
diff
得到额外的参数时,我总是得到一个错误,该参数是由
grep
过滤的文件内容

当我想在这样的脚本中
echo
命令输出时(使用backtick转义),类似的东西总是对我有用:


谢谢

最简单的方法是:

grep -E '^[0-9]+$' file | diff file -
作为文件名的连字符
-
是一种特定的符号,它告诉
diff
“使用标准输入”;它记录在
diff
手册页中。(大多数常用工具都支持相同的表示法。)

反勾号不起作用的原因是它们捕获命令的输出并将其作为参数传递。例如,这:

cat `echo file`
相当于:

cat file
这是:

diff file "`cat file | grep -E ^[0-9]+$`"
相当于这样的东西:

diff file "123
234
456"
也就是说,它实际上试图将
123234345
(加上换行符)作为文件名传递,而不是作为文件内容传递。从技术上讲,您可以通过使用Bash的“进程替换”功能来实现后者,该功能实际上创建了一种临时文件:

diff file <(cat file | grep -E '^[0-9]+$')
diff文件如果您使用的是bash:

diff file <(grep -E '^[0-9]+$' file)
在bash中,语法是

diff file <(cat file | grep -E ^[0-9]+$)

diff文件尝试进程替换:

$ diff file <(grep -E "^[0-9]+$" file)
使用$diff文件(列表)表单,写入文件
将为列表提供输入。如果

其中
-
表示“从标准输入读取”。

我可以这样测试整个命令吗<代码>如果[-z grep-E'^[0-9]+$'文件| diff文件-];然后echo“matches”fi
@Pan.student:实际上您不需要使用
[-z…]
,因为
diff
如果文件之间没有差异,则返回
0
(“成功/正确”),如果有差异,则返回
1
(“失败/错误”),因此如果grep-E'^[0-9],则只需编写
+$'file | diff file->/dev/null;然后回声匹配;fi
。对于这一点,您实际上也不需要使用
diff
,因为
grep
如果找到行,则返回
0
,否则返回
1
,所以您可以只写
if!grep“[^0-9]”文件>/dev/null;然后回声匹配;fi
确认没有包含除
0-9
以外的字符的行。此帖子中的第一个命令不正确,无法工作。
文件的第二个实例必须位于
()
内。按原样编写,
grep
命令将不会在
文件上运行。正确版本:
diff文件
diff <(this_command) <(that_command)
diff file <(cat file | grep -E ^[0-9]+$)
$ diff file <(grep -E "^[0-9]+$" file)
grep -E '^[0-9]+$' file | diff - file