次のテキストを含むファイルがあります。
dt=2016-06-30,path=path1,site=US,mobile=1
dt=2016-06-21,path=path2,site=UK,mobile=0
次のように、キーと値のペアに二重引用符の値を含むテキストに変換したいと思います。
dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"
Sedまたは他のコマンドを使用して、各値を二重引用符の中にどのように入れることができますか?
答え1
使用横
sed -e 's/=\([^,]*\)/="\1"/g' file.txt
使用アッ
awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {sub(/=/,"&\"",$f); sub(/$/,"\"",$f)}; print}' file.txt
またはより短く:
awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {gsub(/=|$/,"&\"",$f)} print}' file.txt
またはより短く:
awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {gsub(/=|$/,"&\"",$f)}} 1' file.txt
使用前任者
Exはファイル用に設計されています。編集するただし、次のように実際にファイルに保存しなくても変更をプレビューできます。
ex -sc '%s/=\([^,]*\)/="\1"/g | %p | q!' file.txt
実際に変更してファイルに保存するには、次を使用します。
ex -sc '%s/=\([^,]*\)/="\1"/g | x' file.txt
ただし、指定したパターンがファイルに見つからない場合(=
ファイルのどこにも存在しない場合)、Exは自動的に終了しません。したがって、より堅牢性を高めるために、通常は次のようにprintf
コマンドをExに渡します。
printf '%s\n' '%s/=\([^,]*\)/="\1"/g' %p | ex file.txt
変更を保存します。
printf '%s\n' '%s/=\([^,]*\)/="\1"/g' x | ex file.txt
答え2
そしてperl
$ # unlike sed/awk, newline is still part of input record
$ perl -pe 's/=\K[^,\n]*/"$&"/g' ip.txt
dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"
$ # or chomp newline and add it back while printing
$ perl -lpe 's/=\K[^,]+/"$&"/g' ip.txt
dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"
答え3
awkを使う
awk '{gsub(/=/, "=\""); gsub(/,/,"\","); print $0"\""}' < file.txt
答え4
使用ミラー:
$ mlr put 'for (k,v in $*) {$[k] = "\"".v."\""}' mobile.dat
dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"