Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 逃离'\';sed表达式中替换字符串中的字符_Bash_String_Sed_Escaping - Fatal编程技术网

Bash 逃离'\';sed表达式中替换字符串中的字符

Bash 逃离'\';sed表达式中替换字符串中的字符,bash,string,sed,escaping,Bash,String,Sed,Escaping,我试着写一行文字,比如 13) Check for orphaned Path entries 并将其更改为(我希望bash颜色代码为输出着色,而不是在屏幕上显示) 使用bash颜色代码将星号上色,使其更加突出。我有一个sed命令可以完成大部分工作,但它不能正确处理颜色代码,因为它将它们视为替换文本的引用 到目前为止,我所拥有的: sed "s/ *13) \(.*\)/ \033[32m*\033[0m \1/" 当对我在开头给出的字符串运行时,将生成以下输出: 13) Ch

我试着写一行文字,比如

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

使用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替换表达式中?

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

sed 's/ *13) \(.*\)/ \\033[32m*\\033[0m \1/'
这可防止外壳干扰sed行为

~~~~~~~

更新:

使用脚本以实现干净的颜色:

colorize.sh

#!/bin/sh

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

sed "s/ *13) \(.*\)/ $HIGHLIGHT*$NORMAL \1/" yourinputtext
试试这个:

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

i、 e.slash-slash-slash-033

您正在使用的
sed
可能不懂八进制,但它可能懂十六进制。尝试此版本以查看它是否适合您(使用
\x1b
而不是
\033
):


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

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

    • 我也有同样的问题,我用这种方法解决了

      您可以尝试更改代码:

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

      sed "s/ *13) \(.*\)/ $(echo '\033[32m')*$(echo '\033[0m') \1/"
      
      基本思想是使用“echo”打印转义命令。 这对我很有效,

      我用的是呆呆的

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

      虽然sed现在没有尝试替换\0,但我仍然没有得到彩色输出。更具体地说,我得到\033[32m*\033][0m直接输出到控制台,而不转换为颜色代码不太清楚您的意思…我的目标是解决替换字符串中转义“\”字符的问题,并且这样做了--我得到了与您在“将其更改为”中引用的相同的输出文本除此之外,你比我更清楚你在寻找什么颜色;只是想确保你有足够的工具来实现这一点。:-)刚刚看到你的更新--我误解了你的“将其更改为”字符串,然后…认为这是您想要输出的。嗯…PS-我的脚本可以工作,但丹尼斯·威廉姆森的回答完成了同样的事情,而且要短得多。使用他的。将反斜杠翻两番会产生与使用单引号和双斜杠相同的效果,正如@DrearPirateshawn建议的那样。我得到\033[32m*\033[0m直接输出到控制台,不转换为颜色代码。基本上是一样的。这就是为什么我的head已经删除了我的评论。如果它确实是grok octal,请使用\o033@Hasturkun:这就是为什么阅读信息文件是值得的。有时候男人就是不剪切它。谢谢你的信息。@Dennis:你是说有时候男人没有与八进制前缀的info?+1相同的手册-大多数程序只识别前导零。
      sed "s/ *13) \(.*\)/ $(echo '\033[32m')*$(echo '\033[0m') \1/"
      
      gawk -v string1=$STRING1 -v IGNORECASE=1 ' { gsub ( string1 , "\033[1m&\033[0m" ) ; print } '