【问题标题】:Escaping the '\' character in the replacement string in a sed expression在 sed 表达式中转义替换字符串中的“\”字符
【发布时间】:2010-11-07 01:16:43
【问题描述】:

我正在尝试使用一行文字

    13) Check for orphaned Path entries

并将其更改为(我希望 bash 颜色代码为输出着色,而不是显示在屏幕上)

\033[32m*\033[0m Check for orphaned Path entries

使用 bash 颜色代码为星号着色以使其更加突出。我有一个 sed 命令可以完成大部分工作,但它不能正确处理颜色代码,因为它将它们视为对替换文本的引用。

到目前为止我所拥有的:

sed "s/ *13) \(.*\)/ \033[32m*\033[0m \1/"

在我在开头给出的字符串上运行时会产生以下输出:

   13) Check for orphaned Path entries33[32m*  13) Check for orphaned Path entries33[0m Check for orphaned Path entries

它采用 \033 的 \0 并将其替换为原始字符串。将替换字符串中的反斜杠加倍没有区别;我仍然得到相同的输出文本。

如何在 sed 替换表达式中插入 bash 颜色转义?

【问题讨论】:

  • 如@DreadPirateShawn 所建议的,将反斜杠加四倍会产生与使用单引号和双倍斜杠相同的效果。我得到 \033[32m*\033[0m 直接输出到控制台,而不是变成颜色代码。
  • 基本上是一样的。这就是为什么我已经删除了我的评论。

标签: bash string sed escaping


【解决方案1】:

在替换字符串中加双反斜杠,并在 sed 表达式周围使用单引号而不是双引号:

sed 's/ *13) \(.*\)/ \\033[32m*\\033[0m \1/'

这可以防止 shell 干扰 sed 行为。

~~~~~~~

更新:

使用脚本实现颜色干净:

colorize.sh

#!/bin/sh

HIGHLIGHT=`echo -e '\033[32m'`
NORMAL=`echo -e '\033[0m'`

sed "s/ *13) \(.*\)/ $HIGHLIGHT*$NORMAL \1/" yourinputtext

【讨论】:

  • 虽然 sed 现在没有尝试替换 \0,但我仍然没有得到彩色输出。
  • 更具体地说,我得到\033[32m*\033[0m直接输出到控制台,而不是变成颜色代码
  • 不太清楚你的意思......我的目标是解决在替换字符串中转义“\”字符的问题,并且这样做了——我得到了你引用的相同输出文本您上面的“将其更改为”字符串。除此之外,你比我更清楚你在寻找什么颜色;只是想确保您已经确定了这样做的工具。 :-)
  • 刚刚看到您的更新——我误解了您的“将其更改为”字符串,然后...认为这就是您想要输出的内容。嗯……
  • PS - 我的脚本有效,但丹尼斯威廉姆森的回答完成了同样的事情,而且要短得多。用他的。
【解决方案2】:

试试这个:

sed  "s/ *13) \(.*\)/ \\\\033 \1/"

即slash-slash-slash-slash-033

【讨论】:

    【解决方案3】:

    您使用的sed 可能不理解八进制,但它可能理解十六进制。试试这个版本,看看它是否适合你(使用\x1b 而不是\033):

    sed "s/ *13) \(.*\)/ \x1b[32m*\x1b[0m \1/"
    

    【讨论】:

    • 如果是 grok 八进制,使用 \o033
    • @Hasturkun:这就是阅读信息文件的原因。有时候,人就是不剪。感谢您的信息。
    • @Dennis:你的意思是有时候 man 没有和 info 一样的手册?
    【解决方案4】:

    您的 '\033' 实际上是单个 ESC(转义)字符,要输出此字符,您可以使用以下任何一种:

    • \o033
    • \d027
    • \x1B
    • \c[CTRL-[

    【讨论】:

    • +1 表示八进制前缀 - 大多数程序只识别前导零。
    【解决方案5】:

    我遇到了同样的问题,我就这样解决了。

    您可以尝试更改您的代码:

    sed "s/ *13) \(.*\)/ \033[32m*\033[0m \1/"
    

    进入这个:

    sed "s/ *13) \(.*\)/ $(echo '\033[32m')*$(echo '\033[0m') \1/"
    

    基本思想是使用'echo'来打印转义命令。 它对我有用,

    【讨论】:

      【解决方案6】:

      我用 gawk

      gawk -v string1=$STRING1 -v IGNORECASE=1 ' { gsub ( string1 , "\033[1m&\033[0m" ) ; print } '
      

      【讨论】:

        猜你喜欢
        • 2012-02-17
        • 2019-11-15
        • 1970-01-01
        • 2021-11-20
        • 2023-03-07
        • 1970-01-01
        • 2012-10-09
        相关资源
        最近更新 更多