6

我正在尝试使用一行文字,例如

    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 并将其替换为原始字符串。将替换字符串中的反斜杠加倍没有区别;我仍然得到相同的输出文本。

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

4

6 回答 6

9

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

sed "s/ *13) \(.*\)/ \x1b[32m*\x1b[0m \1/"
于 2009-06-30T16:19:27.363 回答
8

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

  • \o033
  • \d027
  • \x1B
  • \c[为了CTRL-[
于 2009-06-30T16:25:42.980 回答
3

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

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

这可以防止外壳干扰 sed 行为。

~~~~~~~

更新:

使用脚本干净地实现颜色:

着色.sh

#!/bin/sh

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

sed "s/ *13) \(.*\)/ $HIGHLIGHT*$NORMAL \1/" yourinputtext
于 2009-06-30T15:35:47.847 回答
2

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

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

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

进入这个:

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

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

于 2012-11-08T16:35:32.760 回答
0

我用 gawk

gawk -v string1=$STRING1 -v IGNORECASE=1 ' { gsub ( string1 , "\033[1m&\033[0m" ) ; print } '
于 2013-04-11T09:03:28.270 回答
-1

试试这个 :

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

即斜线斜线斜线斜线033

于 2009-06-30T15:46:49.073 回答