bash脚本文本替换1个字符占位符重复x次,零填充数

时间:2014-11-03 00:06:40

标签: regex string bash

对于bash脚本 - 假设我输入了一个带有“占位符”的文本'对于这种格式的数字:     [V]或[VV]或[VVV]或[VVVV]等 每个' V'方括号内的字符表示0(零)填充的占位符。

因此,如果变量(整数) - NUM = 17,则它应该替换为例如[VVV]'占位符'在文本中作为' 017',例如[VVVVV]为' 00017'等,单个[V]为' 17' - 一个完整的数字,没有填充。

代码示例:

NUM=17

TXT="The version of the new set will be: [V] - after your changes."

# - this is the 1 line I used for the replacement
#   (escaping the square brackets with \)

RESULT="${TXT//\[V*\]/$NUM}"

echo "$RESULT"

# Returns: "The version of the new set will be: 17 - after your changes."

我的解决方案非常基本且存在问题:它确实用$ NUM取代[V],[VV]等,但它也取代了[V xxx]之类的任何内容。

我需要确保只有' V'字符被视为唯一有效的占位符,因此 - [V]或[VV]或[VVV]或[VVVV]等等,[Vxxx]等条目将被忽略。

我也很感激有关计算' V'输入文本中的字符,所以我可以应用0(零)填充。

代码示例:

LEN= # get the length of the [VVVVV] place holder from $TXT to var. LEN - please advise
RESULT=${TXT//[V*]/$(printf '%0'"$LEN"'d' $(( 10#$NUM )))}

我很欣赏任何使这项工作变得简单的想法。

谢谢。

2 个答案:

答案 0 :(得分:1)

感谢您提示RBH。

这是我带来的解决方案;你们看到这个有什么不对吗?:

代码示例:

NUM=17
TXT="The version of the new set will be: [V];  Format 1: [VVV] Format 2: [VVVV] Format 3: [VVVVVVVVV]"
echo $TXT
V_LIST=$(echo "$TXT" | grep -o '\[V*\]' | sed -e "s/\[//g" -e "s/\]//g")
for V_ITEM in $V_LIST; do
    TXT=${TXT//\[$V_ITEM\]/$(printf '%0'"${#V_ITEM}"'d' $(( 10#$NUM )))}
done
echo $TXT

答案 1 :(得分:0)

要解决您的第一个问题,您可以使用以下命令:

RESULT=$(echo "$TXT" |sed -r "s/\[V+\]/$NUM/") 

此sed命令将替换VV之后的[]零次或多次出现