我想使用 sed 转换文件。源文件具有以下格式(“deviceId”是占位符):
CREATE DATABASE "deviceId";
column value=88i 1445137680000000000
column value=68i 1445137620000000000
column value=80i 1445137560000000000
column value=39i 1445137500000000000
转换后,格式如下:
USE DATABASE "db";
series,device=deviceId column=88i 1445137680000000000
series,device=deviceId column=68i 1445137620000000000
series,device=deviceId column=80i 1445137560000000000
series,device=deviceId column=39i 1445137500000000000
但我不明白,如何在每一行中获取 deviceId。我当前的 sed.txt
包含以下代码:
s/^\(CREATE DATABASE ".*";\)$/USE DATABASE "db";/g
s/\(.*\) .*=\(.*\) \(.*\)/series,device= \1=\2 \3/g
并生成以下输出:
USE DATABASE "db";
series,device= column=88i 1445137680000000000·
series,device= column=68i 1445137620000000000
series,device= column=80i 1445137560000000000
series,device= column=39i 1445137500000000000
有人可以解释我如何在每行中获取 deviceId 吗?我已经看到使用 Hold-Space/Flow-Work 是可行的。我试过了,但我不知道这应该如何工作。
谢谢!
最佳答案
您正在尝试使用错误的工具。我希望,虽然你可以想出一些神奇的 rune 来强制 sed 产生你想要的输出,但为了健壮性、可移植性、简单性、效率以及软件的几乎所有其他理想属性,标准的 UNIX 工具可用于任何其他比单行上的简单替换是 awk:
$ awk -F'["=]' '
NR==1{dev=$(NF-1); $0 = "USE DATABASE \"db\""}
NR>1 {$0 = "series,device=" dev " column=" $2}
1' file
USE DATABASE "db"
series,device=deviceId column=88i 1445137680000000000
series,device=deviceId column=68i 1445137620000000000
series,device=deviceId column=80i 1445137560000000000
series,device=deviceId column=39i 1445137500000000000
关于Linux SED - 保留空间 - 所有行的一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36375017/