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

时间:2019-08-30 22:43:54

标签: bash 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

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

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

4 个答案:

答案 0 :(得分:3)

colorLine() {
    sed "/$1/s//"$'\e[31m&\e[0m/' file.txt
}
colorLine "#.*"

进行了多次修复,但是它使用$1从函数的参数中识别出图案,然后使用ANSI-C quoting对转义序列进行编码-并修复了(最初)转义序列后缺少[。它还避免了"UUoC — Useless Use of 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
}

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

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

答案 1 :(得分:1)

使用GNU sed和Kubuntu 16.04。

foo="#.*"
sed 's/'"$foo"'/\x1b[31m&\x1b[0m/' file

答案 2 :(得分:0)

我会欺骗grep为我做这件事:

function colorLine() {
    GREP_COLORS="mt=31" grep --color=always --context=$(wc -l <file.txt) --no-filename "$1" file.txt
}

绝招:

  • GREP_COLORS="mt=31":用于在任何匹配行中匹配非空文本的SGR子字符串。此处将在匹配的字符串前生成\e[31m红色,并在匹配的字符串后重置为默认颜色。

  • --color=always:即使在非交互式外壳中也始终着色

  • context=$(wc -l <file.txt):输出的上下文行数与文件中的行数(因此所有行)一样多。

  • --no-filename:不打印文件名

答案 3 :(得分:0)

awk版本

black='\033[30;1m'
red='\033[31;1m'
green='\033[32;1m'
yellow='\033[33;1m'
blue='\033[34;1m'
magenta='\033[35;1m'
cyan='\033[36;1m'
white='\033[37;1m'

color=$cyan
colorLine() { awk -v s="$1" -v c=$color '$0~s {$0=c$0"\033[0m"}1' file.txt; }
colorLine "#.*"

您可以将文件作为变量添加为vell:

color=$cyan
file="file.txt"
colorLine() { awk -v s="$1" -v c=$color '$0~s {$0=c$0"\033[0m"}1' $file; }
colorLine "#.*"

awk\e打印为\033


更动态的版本:

colorLine() { 
    temp=$2;
    col=${!temp};
    awk -v s="$1" -v c=$col '$0~s {$0=c$0"\033[0m"}1' $3; }
colorLine "#.*" green file.txt

然后您有colorLine pattern color file