Sha*_*kla 4 sed text-processing regular-expression csv-simple
我有一个包含文本的文件,如下所示:
dt=2016-06-30,path=path1,site=US,mobile=1
dt=2016-06-21,path=path2,site=UK,mobile=0
Run Code Online (Sandbox Code Playgroud)
我想将其转换为键值对中带有双引号值的文本,如下所示:
dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"
Run Code Online (Sandbox Code Playgroud)
如何使用 Sed 或任何其他命令将每个值放在双引号内?
sed -e 's/=\([^,]*\)/="\1"/g' file.txt
Run Code Online (Sandbox Code Playgroud)
awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {sub(/=/,"&\"",$f); sub(/$/,"\"",$f)}; print}' file.txt
Run Code Online (Sandbox Code Playgroud)
或者,更短:
awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {gsub(/=|$/,"&\"",$f)} print}' file.txt
Run Code Online (Sandbox Code Playgroud)
更短:
awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {gsub(/=|$/,"&\"",$f)}} 1' file.txt
Run Code Online (Sandbox Code Playgroud)
Ex 是为文件编辑而设计的,但您可以预览更改而无需实际将它们保存回文件,如下所示:
ex -sc '%s/=\([^,]*\)/="\1"/g | %p | q!' file.txt
Run Code Online (Sandbox Code Playgroud)
要实际进行更改并将其保存到文件中,请使用:
ex -sc '%s/=\([^,]*\)/="\1"/g | x' file.txt
Run Code Online (Sandbox Code Playgroud)
但是,如果您提供在文件中找不到的模式(例如,文件中没有=
任何地方),那么 Ex 将不会自动退出。因此,为了更好的鲁棒性,我通常使用printf
将命令传递给 Ex:
printf '%s\n' '%s/=\([^,]*\)/="\1"/g' %p | ex file.txt
Run Code Online (Sandbox Code Playgroud)
并保存更改:
printf '%s\n' '%s/=\([^,]*\)/="\1"/g' x | ex file.txt
Run Code Online (Sandbox Code Playgroud)