在sed表达式中替换字符串时如何转义反斜杠字符

8

我将尝试翻译一段类似于以下的文字:

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

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


四倍反斜杠的效果与使用单引号和双反斜杠相同,正如@DreadPirateShawn所建议的那样。我可以直接在控制台上获得\033[32m*\033[0m输出,而不会被转换为颜色代码。 - Chris Lieb
基本上是一样的东西。这就是为什么我已经删除了我的评论。 - balpha
6个回答

10

很有可能你正在使用的sed不支持八进制,但它可能支持十六进制。尝试使用这个版本并查看是否有效(使用\x1b代替\033):

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

2
如果它可以理解八进制,请使用\o033。 - Hasturkun
@Hasturkun:这就是为什么阅读信息文件很重要。有时候手册并不能解决问题。感谢你提供的信息。 - Dennis Williamson
@Dennis:你的意思是说有时候人类没有与信息相同的手册? - Léo Léopold Hertz 준영

8

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

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

+1 表示八进制前缀——大多数程序只识别前导零。 - Dennis Williamson

3

在替换字符串中加倍反斜杠,并使用单引号代替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,但我仍然无法获得彩色输出。 - Chris Lieb
更具体地说,我直接在控制台上获得 \033[32m*\033[0m 输出,而没有被转换成颜色代码。 - Chris Lieb
不太确定你的意思是什么...我的目标是解决替换字符串中转义字符 '' 的问题,并且已经成功做到了 - 我得到了你在上面的 "change it to" 字符串中引用的相同输出文本。除此之外,你对颜色方面的需求比我更清楚;只是想确保你掌握了必要的工具来实现。 :-) - DreadPirateShawn
刚看到你的更新——我误解了你的“更改为”字符串,然后……以为那是你想要输出的。嗯…… - DreadPirateShawn
PS - 我的脚本可以工作,但是Dennis Williamson的答案也能实现同样的功能,并且更加简短。请使用他的答案。 - DreadPirateShawn
抱歉复制你的答案。我错过了反引号(和回声)。这就是我总是使用$()的原因之一——改善可读性,因为不会与单引号混淆。 - Dennis Williamson

2

我曾经遇到过同样的问题,我是这样解决的。

你可以尝试修改你的代码:

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

转化为:

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

基本思路是使用“echo”打印转义命令。在我的情况下,它起作用了。

0

我使用 gawk

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

-1

试试这个:

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

即斜杠-斜杠-斜杠-斜杠-033


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接