greenh='\e[2;30;42m$&\e[0m/g'
yellowh='\e[2;30;43m$&\e[0m/g'
aquah='\e[2;30;46m$&\e[0m/g'
function recolor() {
perl -pe "s/$1/$2"
}
Run Code Online (Sandbox Code Playgroud)
我用它来重新着色文本
例子:
cat file.txt | recolor WHATEVERWORD $greenh
Run Code Online (Sandbox Code Playgroud)
有没有办法可以将 包含$在函数中,以便我可以像这样使用它
cat file.txt | recolor WHATEVERWORD greenh
Run Code Online (Sandbox Code Playgroud)
我试过
function recolor() {
perl -pe "s/$1/$$2"
}
function recolor() {
perl -pe "s/$1/\$$2"
}
Run Code Online (Sandbox Code Playgroud)
他们俩都完全破坏了功能......
那确实是错误的做法;你把一堆黑客堆在一起,所有这些都“泄漏”到不同的层。(例如,考虑recolor 'x//g;#' greenh,它旨在获取 的出现x//g;#并将其着色为绿色,但实际上获取了 的出现x并将其删除;或者recolor foo blueh,其旨在获取的出现foo并将其着色为蓝色,但实际上不起作用,因为你的函数秘密地依赖于一个被设置的全局变量,而用户没有定义$blueh。)
我认为你最好只定义单个函数:
greenh() { pat="$1" perl -pe 's/$ENV{pat}/\e[2;30;42m$&\e[0m/g' ; }
yellowh() { pat="$1" perl -pe 's/$ENV{pat}/\e[2;30;43m$&\e[0m/g' ; }
aquah() { pat="$1" perl -pe 's/$ENV{pat}/\e[2;30;46m$&\e[0m/g' ; }
Run Code Online (Sandbox Code Playgroud)
如果您确实想要一个recolor函数,那么最好定义其中的颜色:
recolor() {
perl -e '
my $prefix =
{
"greenh" => "\e[2;30;42m",
"yellowh" => "\e[2;30;43m",
"aquah" => "\e[2;30;46m",
}->{$color};
die "Unrecognized color $color" unless $prefix;
while (<>) {
s/$pat/$prefix$&\e[0m/g;
print;
}
' -s -- -pat="$1" -color="$2"
}
Run Code Online (Sandbox Code Playgroud)
(不过,为了完整起见,我应该提到 Bash 确实支持变量间接;如果$2是greenh,那么${!2}无论$greenh是什么。但通常最好避免使用该功能,而您的示例正是原因。)