递归(嵌套)grep 给出“无效字符范围”错误

Jim*_*Jim -1 osx grep regular-expression

我有一个文件test.xml(如下所示)。这个grep有效:

grep '<appointment-id internal:ref=1.2.3/>' test.xml
Run Code Online (Sandbox Code Playgroud)

输出是:

    <appointment-id internal:ref=1.2.3/>
Run Code Online (Sandbox Code Playgroud)

但这失败了:

grep "$(grep '<appointment-id internal:ref=1.2.3/>' test.xml)" test.xml
Run Code Online (Sandbox Code Playgroud)

输出是:

grep: invalid character range
Run Code Online (Sandbox Code Playgroud)

内容test.xml

<note>
    <to>Jim</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Some text</body>
    <appointment-id internal:ref=1.2.3/>
</note>
Run Code Online (Sandbox Code Playgroud)

我已将两个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
Run Code Online (Sandbox Code Playgroud)

这是它的输出:

++ 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
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 6

grep即使输出不是终端,您的(内部)也会产生彩色输出。当GREP_COLOR环境变量设置为always.

进行着色的控制代码包含字符,当您将它们输入到外部时grep,这些字符会被解释为字符范围。

当解释为字符范围时,模式无效。

解决方案是grep通过显式使用--color=never或设置适当的环境变量 ( GREP_COLOR=never)来禁用 输出的着色。

如果您设置GREP_COLOR=auto,grep应该只在写入终端时产生彩色输出,就像grep您的示例中的外部情况一样,而不是内部grep

  • @Jim 我不能说我曾经遇到过这个问题。我知道我的 grep 是什么,当从文件中返回一行时,我知道它已经匹配了。至少对我来说,这似乎已经足够了。如果你设置`GREP_COLOR=auto`,`grep` 应该只在直接写入终端时产生彩色输出。这可能对你更好,可能。 (2认同)