使用sed/awk替换含斜杠变量至配置行及格式修正问题
颜色列表处理与配置文件修改问题解决
工具
rxvt-unicode (urxvt) v9.31GNU bash, version 5.2.26(1)-release (x86_64-pc-linux-gnu)GNU Awk 5.3.0sed (GNU sed) 4.9tr (GNU coreutils) 9.4
预期操作
- 从
~/.colour_list提取前9个颜色(每行一个) - 移除每个颜色开头的
# - 每2个字符后添加
/,例如FF/FF/FF/ - 为每个颜色追加透明度值,例如
FF/FF/FF/2F - 为每个颜色前置
rgba:,例如rgba:FF/FF/FF/2F - 生成逗号加空格分隔的列表(最后一项无逗号)
- 将列表存入变量
bc - 将
$bc写入test.conf中bar_colour =之后
输入
.colour_list内容:
#000000 #000001 #000002 #000004 #000005 #000006 #000007 #000008 #000009 #00000A #00000B #00000C #00000D #00000E #00000F
现有处理脚本
tst.sh内容:
#!/bin/bash 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输出:
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 ...
预期输出
执行脚本后bash输出:
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 ...
存在问题
- 变量
$bc赋值时未正确生成逗号分隔列表,实际输出为空格分隔,原通过字符数添加逗号的逻辑不可靠,易出错 - sed命令匹配
bar_colour =时使用固定空格,无法适配配置文件中任意数量的空格/制表符,变量代入时导致sed语法错误
已尝试方法
尝试多个Stack Overflow方案无效,推测sed报错因变量含斜杠,修改分隔符、添加双引号后问题依旧
修正方案
1. 正确生成逗号分隔的颜色列表
放弃字符数匹配逻辑,改用paste -sd ', '直接合并每行rgba项,自动生成规范的逗号分隔列表:
bc=$(head -n"$value" ~/.colour_list | tr -d '#' | sed 's/.\{2\}/&\/g;s/.$//' | awk -v trans="$transparency" '{print "rgba:" $0 trans}' | paste -sd ', ')
awk改用变量传递透明度值,写法更清晰paste -sd ', '自动将所有行用,连接,最后一项无多余逗号
2. 修复sed配置文件修改命令
将匹配bar_colour与=之间的固定空格改为\s*,适配任意数量的空格/制表符:
sed -ri "s|^(bar_colour\s*=\s*).*|\1$bc|" ~/test.conf
- 使用
\s*匹配任意空格/制表符,无需固定空格数量 - 保留
|作为sed分隔符,避免变量中的/干扰语法
完整修正后的脚本
#!/bin/bash value=9 transparency=FF bc=$(head -n"$value" ~/.colour_list | tr -d '#' | sed 's/.\{2\}/&\/g;s/.$//' | awk -v trans="$transparency" '{print "rgba:" $0 trans}' | paste -sd ', ') sed -ri "s|^(bar_colour\s*=\s*).*|\1$bc|" ~/test.conf echo "$bc"
内容的提问来源于stack exchange,提问作者twelfth
相关产品推荐
相关产品推荐

