我有一个文件test.xml
(如下所示)。这个 grep 的工作原理是:
grep '<appointment-id internal:ref=1.2.3/>' test.xml
输出是:
<appointment-id internal:ref=1.2.3/>
但这失败了:
grep "$(grep '<appointment-id internal:ref=1.2.3/>' test.xml)" test.xml
输出是:
grep: invalid character range
内容test.xml
:
<note>
<to>Jim</to>
<from>John</from>
<heading>Reminder</heading>
<body>Some text</body>
<appointment-id internal:ref=1.2.3/>
</note>
我已将这两个grep
命令(简单命令和嵌套命令)放入带有set -x
.这是该脚本的精确复制和粘贴:
set -x
grep '<appointment-id internal:ref=1.2.3/>' test.xml
grep "$(grep '<appointment-id internal:ref=1.2.3/>' test.xml)" test.xml
exit 0
这是它的输出:
++ grep '<appointment-id internal:ref=1.2.3/>' test.xml
<appointment-id internal:ref=1.2.3/>
+++ grep '<appointment-id internal:ref=1.2.3/>' test.xml
++ grep ' <appointment-id internal:ref=1.2.3/>' test.xml
grep: invalid character range
++ exit 0
答案1
grep
即使输出不是终端,您的(内部)也会产生彩色输出。当GREP_COLOR
环境变量设置为时,它可能会这样做always
。
进行着色的控制代码包含的字符,当您将它们输入到外部时grep
,将被解释为字符范围。
当解释为字符范围时,该模式无效。
grep
解决方案是通过显式使用--color=never
或设置适当的环境变量 ( )来禁用 输出的着色GREP_COLOR=never
。
如果您设置GREP_COLOR=auto
,grep
应该只在写入终端时产生彩色输出,就像grep
示例中的outer 的情况,但不是inner 的情况grep
。