sed用正则表达式替换正则表达式

卡夫

给定以下内容file.txt

this is line 1
# this is line 2
this is line 3

我想用sed#开头的行替换为\e[31m${lineContent}\e[0m这将为该特定行着色。另外,我需要将颜色\e[31m设置为变量color(此示例的期望输出将使第二行带有颜色)。我有以下内容:

function colorLine() {
    cat file.txt | sed ''/"$1"/s//"$(printf \e[31m $1 \e[0m)"/g''
}
colorLine "#.*"

color到目前为止,我不知道该变量,因为我不确定该怎么做。其输出为(第二行为红色):

this is line 1
#.*
this is line 3

显然是从字面上解释替换字符串。我的问题是如何使用匹配的行生成替换字符串?

我知道我可以做些容易得多的事情,例如将sed附加\e[31m到以开头的所有行的开头#,但是将sed与正则表达式一起使用很重要。

乔纳森·莱夫勒
colorLine() {
    sed "/$1/s//"$'\e[31m&\e[0m/' file.txt
}
colorLine "#.*"

进行了多次修复,但是它用于$1从函数的参数中识别出模式,然后使用ANSI-C引号对转义序列进行编码-并修复了(最初)[在转义序列之后缺少的颜色重置序列。它还避免了“ UUoC-的无用使用cat”的费用

固定文件名不是很理想,但将其固定留给读者练习。


如果我需要\e[31m成为变量,该怎么办$color如何更改报价?

我有一个colour-diff脚本,其中包含(使用Perl表示法-我已经像以前一样使用ANSI C引用将其翻译为Bash表示法):

reset=$'\e[0m' 
black=$'\e[30;1m'      # 30 = Black,   1 = bold
red=$'\e[31;1m'        # 31 = Red,     1 = bold
green=$'\e[32;1m'      # 32 = Green,   1 = bold
yellow=$'\e[33;1m'     # 33 = Yellow,  1 = bold
blue=$'\e[34;1m'       # 34 = Blue,    1 = bold
magenta=$'\e[35;1m'    # 35 = Magenta, 1 = bold
cyan=$'\e[36;1m'       # 36 = Cyan,    1 = bold
white=$'\e[37;1m'      # 37 = White,   1 = bold

使用这些变量,您可以根据需要创建函数:

colorLine() {
    sed "/$1/s//$blue&$reset/“ file.txt
}

设置这些变量的位置取决于定义函数的位置。就我自己而言,我可能会使用完整的参数解析来制作脚本而不是函数,然后从那里开始。青年汽车

查看ANSI颜色转义序列列表,以获取更全面的颜色列表(以及其他效果,包括背景色和前景色)以及用于生成颜色的转义序列。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章