【发布时间】:2013-02-22 10:14:52
【问题描述】:
我有一个包含内容的文件:
Version:2.0
我需要以下格式的输出:
"Version":"2.0"
我应该如何在这些列中插入双引号?
【问题讨论】:
我有一个包含内容的文件:
Version:2.0
我需要以下格式的输出:
"Version":"2.0"
我应该如何在这些列中插入双引号?
【问题讨论】:
简单的单行:
perl -plwe 's/([^:]+)/"$1"/g'
取任何不是冒号的内容并在其周围加上引号。由于-l 选项,我们避免了这种情况,包括末尾的换行符。
【讨论】:
:。不要将Version:2.0 放在双引号中。
$1,但您的外壳仍然存在 - 但即便如此,引号仍然会被插入。所以,不,你所说的发生在这段代码中是不可能发生的。
sed -r 's/(^|$)/"/g;s/:/":"/' file
kent$ echo "Version:2.0"|sed -r 's/(^|$)/"/g;s/:/":"/'
"Version":"2.0"
【讨论】:
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'
【讨论】:
perl -lpe'$_ = join ":",map qq{"$_"},split /:/' myfile
【讨论】:
这是另一个sed 替代方案:
echo Version:2.0 | sed 's/[^:]*/"&"/g'
输出:
"Version":"2.0"
【讨论】:
我认为awksn-p 可能会有所帮助:
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
【讨论】:
在 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
【讨论】:
"":"" 而不是"Version":"2.0"