在 sed/awk 中用变量(包含斜杠)替换搜索到的字符串

问题描述 投票:0回答:1

工具

  • 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
  • 每 16 个字符(最后一个字符除外)放置一个
    ,
    以创建逗号分隔列表;
    rgba: FF/FF/FF/2F, rgba: 2F/AA/66/2F ...
  • 将整个逗号分隔列表放入变量中
    bc
  • 将变量
    bc
    放置在文件中精确字符串匹配
    bar_color               = 
    (包括空格)之后
    test.conf

问题

我有两个问题。

  1. $bc
    赋值(参见
    sed 's/.\{2\}/&\//g;s/.$//'
    )删除所有逗号,我只想删除整个字符串的最后一个逗号(即最后一个字符)。

  2. 找到字符串

    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
...

尝试过的方法

我已经尝试过以前的答案(1234),但它们似乎都不起作用,并且总是如上返回。

我至少猜测

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

不幸的是,这也提供了与输出部分相同的错误。

bash awk sed
1个回答
0
投票

一旦将

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"
© www.soinside.com 2019 - 2024. All rights reserved.