You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sed/awk替换含斜杠变量至配置行及格式修正问题

颜色列表处理与配置文件修改问题解决

工具

  • 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个颜色(每行一个)
  • 移除每个颜色开头的#
  • 每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
...

存在问题

  1. 变量$bc赋值时未正确生成逗号分隔列表,实际输出为空格分隔,原通过字符数添加逗号的逻辑不可靠,易出错
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:23:16