转义sed表达式中替换字符串中的'\'字符

时间:2009-06-30 15:29:06

标签: bash string sed escaping

我想尝试一行像

这样的文字
    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

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

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

6 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:8)

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

  • \o033
  • \d027
  • \x1B
  • {li> \c[ CTRL-[

答案 2 :(得分:2)

将替换字符串中的反斜杠加倍,并在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

答案 3 :(得分:2)

我遇到了同样的问题,我以这种方式解决了。

您可以尝试更改代码:

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

进入这个:

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

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

答案 4 :(得分:0)

我用gawk

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

答案 5 :(得分:-1)

试试这个:

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

即。斜线斜线斜线斜线-033