【发布时间】:2018-02-06 19:14:20
【问题描述】:
我有这个 POSIX 兼容的 shell 脚本。它需要一个带分隔符的字符串 w.r.t. | 并将 - 添加到子字符串(如果它们的长度是单个字符):
#!/bin/sh
printf '%s\n' "k|k|jill|hill|k" | sed 's/\([|]\|^\)\([[:alnum:]]\)\([|]\|$\)/\1-\2\3/g'
这个输出:
-k|k|jill|hill|-k
请注意,它不考虑夹在两个分隔符之间的 k(即 |k|)。
更奇怪的是,如果我将原始 sn-p 中的特殊字符更改为其他字符,它确实会在前面加上 -(注意更改:^ 到 something;$ 到 different ),但显然不是第一个和最后一个 k:
#!/bin/sh
printf '%s\n' "k|k|jill|hill|k" | sed 's/\([|]\|something\)\([[:alnum:]]\)\([|]\|different\)/\1-\2\3/g'
输出:
k|-k|jill|hill|k
起初我以为这是因为$ 和^ 位置字符不是可选的。然而,对于第一个标志中的$ 和第一个示例的最后一个标志中的^,它们显然是可选的。
我很想知道,为什么这不起作用,我可以用类似的 sed 表达式做我想做的事吗?
【问题讨论】:
-
它不考虑
k被夹在中间,因为它消耗了上一场比赛中的第一个字符|。所以没有什么可以再匹配了。 -
@revo 您能否在答案中对此进行扩展?也许展示导致它失败的步骤?我不完全理解你的评论