如何使用sed / awk / perl在两列之间插入双引号(“)

时间:2013-02-22 10:14:52

标签: perl sed awk

我有一个包含内容的文件:

Version:2.0

我需要以下格式的输出:

"Version":"2.0"

我应该如何在这些列中插入双引号?

7 个答案:

答案 0 :(得分:3)

简单的单行:

perl -plwe 's/([^:]+)/"$1"/g'

取任何不是冒号的东西并在其周围加上引号。由于-l选项,我们会避免这种情况,包括最后的换行符。

答案 1 :(得分:1)

sed -r 's/(^|$)/"/g;s/:/":"/' file

kent$  echo "Version:2.0"|sed -r 's/(^|$)/"/g;s/:/":"/'  
"Version":"2.0"

答案 2 :(得分:1)

awk -F":" -v OFS=":" '{for(i=1;i<=NF;i++){$i="\""$i"\"";}print}' 

测试:

> echo "Version:2.0" | awk -F":" -v OFS=":" '{for(i=1;i<=NF;i++){$i="\""$i"\"";}print}'
"Version":"2.0"

perl -F -lane 'for(@F){$_="\"".$_."\"";}print join ":",@F'

答案 3 :(得分:1)

 perl -lpe'$_ = join ":",map qq{"$_"},split /:/' myfile

答案 4 :(得分:1)

这是另一个sed替代方案:

echo Version:2.0 | sed 's/[^:]*/"&"/g'

输出:

"Version":"2.0"

答案 5 :(得分:0)

在perl中,你可以这样做:

perl -pe "s/([^:]+):(.+)/\"\1\":\"\2\"/" YourTextFile.txt

编辑1:在Linux中,使用$1$2代替\1\2会导致应引用的字符串为空 - 然后输出'“”:“”'。我认为这是由于美元$在某些* nix shell中是一个特殊字符。逃避美元也是有效的:

perl -pe "s/([^:]+):(.+)/\"\$1\":\"\$2\"/" YourTextFile.txt

编辑2:正如@TLP建议的那样,使用单引号是* nix的方法,因为它避免了shell插值并且还允许删除所有转义。

perl -pe 's/([^:]+):(.+)/"$1":"$2"/' YourTextFile.txt

答案 6 :(得分:0)

我认为这个awk代码段可能有所帮助:

gawk -F: '{gsub("\"", "\"\""); \
  for(i=1;i<NF;i++) printf("\"%s\":",$i); \
  printf("\"%s\"\n",$NF); }' testfile

它做了额外的工作,并且存在引号的双倍。

为了创建测试文件,我使用了以下代码:

cat << EODATA > testfile
Version:2.0
Some:field:with:double(")quotes
EODATA