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