给出以下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与正则表达式一起使用很重要。
答案 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