【发布时间】:2012-07-17 18:32:06
【问题描述】:
我需要用新值 (N,M) where 替换脚本语言中的 Progress (n,m) 和 Progress label="some text title" (n,m) 实例
N= integer ((n/m) * normal)
M= integer ( normal )
进度语句可以在脚本行的任何位置(更糟糕的是,虽然不是当前脚本,但可以跨行拆分)。
值normal是1到255之间的指定数字,n和m是浮点数
到目前为止,我的sed 实现如下。它仅适用于 Progress (n,m) 格式,不适用于 Progress label="Title" (n,m) 格式,但它只是简单的坚果:
#!/bin/bash
normal=$1;
file=$2
for n in $(sed -rn '/Progress/s/Progress[ \t]+\(([0-9\. \t]+),([0-9\. \t]+)\).+/\1/p' "$file" )
do
m=$(sed -rn "/Progress/s/Progress[ \t]+\(${n},([0-9\. \t]+).+/\1/p" "$file")
N=$(echo "($normal * $n)/$m" | bc)
M=$normal
sed -ri "/Progress/s/Progress[ \t]+\($n,$m\)/Progress ($N,$M)/" "$file"
done
简单地说:这行得通,但是,有没有更好的方法?
我的工具箱里有 sed 和 bash 脚本,没有那么多 perl、awk 和我认为这个问题更适合的类似的东西。
编辑示例输入。
Progress label="qt-xx-95" (0, 50) thermal label "qt-xx-95" ramp(slew=.75,sp=95,closed) Progress (20, 50) Pause 5 Progress (25, 50) Pause 5 Progress (30, 50) Pause 5 Progress (35, 50) Pause 5 Progress (40, 50) Pause 5 Progress (45, 50) Pause 5 Progress (50, 50)
Progress label="qt-95-70" (0, 40) thermal label "qt-95-70" hold(sp=70) Progress (10, 40) Pause 5 Progress (15, 40) Pause 5 Progress (20, 40) Pause 5 Progress (25, 40) Pause 5
【问题讨论】:
-
您能提供示例输入和预期输出吗?使用起来会简单得多。
-
听起来您将来需要一个成熟的解析器,所以也许是时候选择一种编程语言了。我推荐 Python,但这只是我自己。
-
@mugenkenichi 添加了示例输入。
-
@IgnacioVazquez-Abrams 我在 lex/yacc 中编写了脚本解析器;但客户不希望我更改代码。
-
@Jamie 请澄清.. 您有一个可以工作的解析器,他们想要更改输出,但不允许您修改解析器?
标签: perl bash scripting sed awk