linux - sed - 将匹配传递给外部命令

标签 linux bash sed css

我已经使用 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

最佳答案

如果您的 sed 是 GNU sed。您可以使用“e”将匹配的组传递给 sed 命令中的外部命令/工具。

一个例子可能有助于说明:

说,你有问题:
你有一个字符串 "120+20foobar" 现在你想得到 120+20 部分的计算结果,并将 "foobar"部分的 "oo"替换为 "xx"。

Note that this example is not for solving the problem above, just for showing the sed 'e' usage

所以你可以在第一个匹配组中制作 120+20,在第二组中休息,然后将两个组传递给不同的命令/工具,然后得到结果。喜欢:

   kent$  echo "100+20foobar"|sed -r 's#([0-9+]*)(.*)#echo  \1 \|bc\;echo \2 \| sed "s/oo/xx/g"#ge'
    120
    fxxbar

通过这种方式,您可以将许多 sed 一个一个地嵌套在另一个 sed 中,直到您迷路为止。 :D

关于linux - sed - 将匹配传递给外部命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11719011/

相关文章:

python - 在 python 中转义子进程调用的正确方法

awk - 正则表达式从一个段落中提取多个单词

c++ - 如何从 C/C++ 控制全局 OpenMP 设置?

linux - 使用 openssl 生成 MD5 哈希的脚本

bash - 本地 : -n: invalid option

bash - 在 bash2 中,如何找到源脚本的名称?

regex - + 正则表达式在 sed 中不起作用

linux - Bash - 定位脚本并使用选项执行

c++ - 在 Linux 上使用 CMake 时,如何告诉 PVS-Studio 忽略第三方库中的所有文件

linux - 当 "jenkins"用户执行带有正则表达式的任务时,ansible 会引发错误