rxvt-unicode (urxvt) v9.31
GNU bash, version 5.2.26(1)-release (x86_64-pc-linux-gnu)
GNU Awk 5.3.0
sed (GNU sed) 4.9
tr (GNU coreutils) 9.4
~/.colour_list
中获取前 9 种颜色,每个颜色之间打印有换行符#
/
; FF/FF/FF/
FF/FF/FF/2F
rgba:
; rgba: FF/FF/FF/2F
,
以创建逗号分隔列表; rgba: FF/FF/FF/2F, rgba: 2F/AA/66/2F ...
bc
bc
放置在文件中精确字符串匹配 bar_color =
(包括空格)之后 test.conf
我有两个问题。
$bc
赋值(参见sed 's/.\{2\}/&\//g;s/.$//'
)删除所有逗号,我只想删除整个字符串的最后一个逗号(即最后一个字符)。
找到字符串
colour =
后,我想将$bc
的值放在它后面,但我却收到错误(见下文)
脚本如下;
value=9
transparency=FF
bc=$(head -n${value} ~/.colour_list |
tr -d '#' |
sed 's/.\{2\}/&\//g;s/.$//' |
awk '{print "rgba:" $0 transparency}' transparency=$transparency |
sed 's/.\{16\}/&,/g')
sed -ri "s|^(bar_colour \s*=\s*).*|\1$bc|" ~/test.conf
echo $bc
输入是上面通过(bash)终端调用的脚本,调用
.colour_list
.color_list:
(这是一个示例版本;该文件本质上是纯文本,带有十六进制颜色列表,以换行符分隔)
#000000
#000001
#000002
#000004
#000005
#000006
#000007
#000008
#000009
#00000A
#00000B
#00000C
#00000D
#00000E
#00000F
输出:
sed: -e expression #1, char 52: unterminated `s' command
rgba:00/00/00/FF rgba:00/00/01/FF rgba:00/00/02/FF rgba:00/00/04/FF rgba:00/00/05/FF rgba:00/00/06/FF rgba:00/00/07/FF rgba:00/00/08/FF rgba:00/00/09/FF
~/test.conf
未改变;
...
bar_colour = test
...
预期输出:
rgba:00/00/00/FF, rgba:00/00/01/FF, rgba:00/00/02/FF, rgba:00/00/04/FF, rgba:00/00/05/FF, rgba:00/00/06/FF, rgba:00/00/07/FF, rgba:00/00/08/FF, rgba:00/00/09/FF
~/test.conf
已更改;
...
bar_colour = rgba:00/00/00/FF, rgba:00/00/01/FF, rgba:00/00/02/FF, rgba:00/00/04/FF, rgba:00/00/05/FF, rgba:00/00/06/FF, rgba:00/00/07/FF, rgba:00/00/08/FF, rgba:00/00/09/FF
...
我已经尝试过以前的答案(1,2,3,4),但它们似乎都不起作用,并且总是如上返回。
我至少猜测
awk
错误,这是因为我尝试替换的变量包含斜杠,但我不确定为什么 sed
会抛出错误。我需要斜杠,因为预期格式符合 XQueryColor 规范。
非常感谢。
编辑:
根据评论将脚本更改为以下内容;
value=9
transparency=FF
bc=$(head -n${value} ~/.colour_list |
tr -d '#' |
sed 's@.\{2\}@&\/@g;s@.$@@' |
awk '{print "rgba:" $0 transparency}' transparency=$transparency |
sed 's@.\{16\}@&,@g')
sed -ri "s|^(bar_colour \s*=\s*).*|\1$bc|" ~/test.conf
echo $bc
不幸的是,这也提供了与输出部分相同的错误。
一旦将
awk
融入其中,您就很有可能替换其他字符串操作工具(例如,head
、tr
、sed
)。
我猜测OP的实际输入如下所示,尽管我不确定,直到OP用
.colour_list
的实际内容更新问题:
$ cat .colour_list
#211c3b
#CB6875
#6E5A86
#745A84
#895B83
#8F668B
#AC6884
#d8abb7
#977780
#ignore_this_line
产生预期输出的一个
awk
想法:
awk -v cnt="${value}" -v tp="${transparency}" '
FNR <= cnt { raw=substr($0,2,6)
gsub(/../,"&/",raw)
printf "%srgba:%sFF", (FNR==1 ? "" : ", "), raw
}
END { print "" }
' .colour_list
这会生成:
rgba:21/1c/3b/FF, rgba:CB/68/75/FF, rgba:6E/5A/86/FF, rgba:74/5A/84/FF, rgba:89/5B/83/FF, rgba:8F/66/8B/FF, rgba:AC/68/84/FF, rgba:d8/ab/b7/FF, rgba:97/77/80/FF
捕捉
bc
:
$ bc=$( awk -v cnt="${value}" -v tp="${transparency}" '
FNR <= cnt { raw=substr($0,2,6)
gsub(/../,"&/",raw)
printf "%srgba:%sFF", (FNR==1 ? "" : ", "), raw
}
END { print "" }
' .colour_list)
$ typeset -p bc
declare -- bc="rgba:21/1c/3b/FF, rgba:CB/68/75/FF, rgba:6E/5A/86/FF, rgba:74/5A/84/FF, rgba:89/5B/83/FF, rgba:8F/66/8B/FF, rgba:AC/68/84/FF, rgba:d8/ab/b7/FF, rgba:97/77/80/FF"