我用sed编写了一个小脚本来改变它:
kaefert@Ultrablech ~ $ cat /sys/class/power_supply/BAT0/uevent
POWER_SUPPLY_NAME=BAT0
POWER_SUPPLY_STATUS=Full
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-ion
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=7400000
POWER_SUPPLY_VOLTAGE_NOW=8370000
POWER_SUPPLY_POWER_NOW=0
POWER_SUPPLY_ENERGY_FULL_DESIGN=45640000
POWER_SUPPLY_ENERGY_FULL=44541000
POWER_SUPPLY_ENERGY_NOW=44541000
POWER_SUPPLY_MODEL_NAME=UX32-65
POWER_SUPPLY_MANUFACTURER=ASUSTeK
POWER_SUPPLY_SERIAL_NUMBER=
成这样的csv文件格式:
kaefert@Ultrablech ~ $ Documents/Asus\ Zenbook\ UX32VD/power_to_csv.sh
"date";"status";"voltage µV";"power µW";"energy full µWh";"energy now µWh"
2012-07-30 11:29:01;"Full";8369000;0;44541000;44541000
2012-07-30 11:29:02;"Full";8369000;0;44541000;44541000
2012-07-30 11:29:04;"Full";8369000;0;44541000;44541000
... (in a loop)
我现在想要的是将每个数字除以1.000.000,这样它们不代表μV,而是代表V和W而不是μW,因此可以快速解读它们。当然,一旦我在libre office calc中打开这个csv,我就可以手动完成这个操作,但我想自动化它。
所以我发现,我可以在sed之间调用外部程序,如下所示:
...
s/\nPOWER_SUPPLY_PRESENT=1\nPOWER_SUPPLY_TECHNOLOGY=Li-ion\nPOWER_SUPPLY_CYCLE_COUNT=0\nPOWER_SUPPLY_VOLTAGE_MIN_DESIGN=7400000\nPOWER_SUPPLY_VOLTAGE_NOW=\([0-9]\{1,\}\)/";'`echo 0`'\1/
并且我可以通过类似的东西获得我想要的值:
echo "scale=6;3094030/1000000" | bc | sed 's/0\{1,\}$//'
但现在问题是,如何将匹配“\ 1”传递给外部命令?
如果您对查看完整脚本感兴趣,可以在那里找到它: http://koega.no-ip.org/mediawiki/index.php/Battery_info_to_csv
答案 0 :(得分:7)
如果你的sed是GNU sed。您可以使用'e'将匹配的组传递给sed命令中的外部命令/工具。
一个例子可能有助于说清楚:
说,你有一个问题:
你有一个字符串"120+20foobar"
现在你想获得120 + 20部分的计算结果,并在“foobar”部分中将“oo”替换为“xx”。
请注意,此示例并非用于解决上述问题,仅供参考 显示sed'e'用法
所以你可以在第一个匹配组中创建120+20
,在第二个组中休息,然后将两个组传递给不同的命令/工具,然后获得结果。像:
kent$ echo "100+20foobar"|sed -r 's#([0-9+]*)(.*)#echo \1 \|bc\;echo \2 \| sed "s/oo/xx/g"#ge'
120
fxxbar
以这种方式,你可以在另一个中嵌入许多seds,直到你迷路为止。 :d
答案 1 :(得分:2)
由于sed
本身不进行算术运算,我建议您使用awk
这样的内容,例如把第3,第5和第6场分成一百万像这样:
awk -F';' -v OFS=';' '
NR == 1
NR != 1 {
$3 /= 1e6
$5 /= 1e6
$6 /= 1e6
print
}'
-F';'
和-v OFS=';'
指定输入和输出字段分隔符。NR == 1
无需更改即可通过第一行。NR != 1
如果不是第一行,则划分并打印。答案 2 :(得分:0)
要直接除以1,000,000,请执行以下操作:
Q='3094030/1000000'
sed ':r /^[[:digit:]]\{7\}/{s$\([[:digit:]]*\)\([[:digit:]]\{6\}\)/1000000$\1.\2$;p;d};s:^:0:;br;d'