存储在 CSV 中的双引号值分配?

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 或任何其他命令将每个值放在双引号内?

Wil*_*ard 7

使用Sed

sed -e 's/=\([^,]*\)/="\1"/g' file.txt
Run Code Online (Sandbox Code Playgroud)

使用awk

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)