2013-02-22 116 views
2

我插入兩列之間的雙引號(「),我有內容的文件:如何使用SED/AWK/perl的

Version:2.0 

我需要在以下格式的輸出:

"Version":"2.0" 

我應該如何在這些列中插入雙引號

回答

3

簡單的一行:

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

採取任何不是一個冒號,把周圍的引號。由於-l選項,我們避免在最後包括換行符。

+0

這實際上只打印所有列的':'。不要將'Version:2.0'放在雙引號中。 – 2013-02-22 11:34:42

+1

@AshutoshNarayan我不知道該怎麼告訴你,除了:不,它不僅打印所有列的冒號,而且它確實把它放在雙引號中。正則表達式去除任何東西的唯一方式是匹配,如果匹配,它也會捕獲和替換。如果它不適合你,那是因爲你改變了它,或者你的shell儘管插入了'$ 1',但即便如此,仍然會插入引號。所以,不,你說的這個代碼不會發生。 – TLP 2013-02-22 11:41:03

+0

是的,它插入雙引號。我想我會錯過一些東西。可接受的。 – 2013-02-22 12:12:53

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

kent$ echo "Version:2.0"|sed -r 's/(^|$)/"/g;s/:/":"/' 
"Version":"2.0" 
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的方式,因爲它避免了外殼插值,也允許放棄全部逃逸。

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

它拋出輸出' 「」: 「」',而不是' 「版本」: 「2.0」' – 2013-02-22 10:24:11

+0

這是奇怪!在Windows上,w/Perl 5.16可以工作,但在Linux上,w/Perl 5.10的行爲就像你描述的那樣。無論如何,解決方法是使用反斜槓代替美元作爲反向引用 - 編輯答案... – zb226 2013-02-22 10:28:49

+1

在Linux中使用單引號以避免shell插值。 – TLP 2013-02-22 10:34:15

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' 
1
perl -lpe'$_ = join ":",map qq{"$_"},split /:/' myfile 
+0

@ Borodin.I喜歡你的解決方案。 – Vijay 2013-02-22 14:12:39

+1

@sarathi:謝謝。不像其他人那樣簡短(我最喜歡的是TLP),但IMO描述了它的功能。 – Borodin 2013-02-22 17:03:01

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 
1

下面是另一個sed選擇:

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

輸出:

"Version":"2.0"