다음과 같은 텍스트가 포함된 파일이 있습니다.
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"