2016-08-24 95 views
1

我有一些awk重新排列一行。我想跳過其中一個變量(例如$ _),以這種方式"\以反斜槓轉義。如何用awk轉義反斜槓和雙引號

實施例:

echo "Ehm, \"hi\", he \\ said" | awk '{$1="" ; print "\"" $_ "\"" }' 
" "hi", he \ said" 

(不改變回波,通常我從在它具有Ehm, "hi", he \ said文件讀取)。

我想有

" \"hi\", he \\ said" 

代替。我怎樣才能做到這一點?有沒有awk中的函數可以做到這一點?

+1

什麼是'$ _'在awk程序的情況下? –

+0

@Tom這意味着,該行的其餘部分 –

+1

正如在[這個問題](http://stackoverflow.com/q/6293790/2088135)的答案中提到的,它看起來像'$ _'結束工作,因爲'_'評估爲'0',所以你最終得到'$ 0'。在awk腳本中看到'$ _'並不典型。使用'$ 0'來引用整行。 –

回答

1

當你用Bash傳遞一個字符串時,你必須考慮echo本身正在用雙引號執行什麼。在這裏找到:

$ echo "Ehm, \"hi\", he \\ said" | awk '1' 
Ehm, "hi", he \ said 

使用單引號解決問題的一部分:

$ echo 'Ehm, \"hi\", he \\ said' | awk '1' 
Ehm, \"hi\", he \\ said 

這是說,現在是時候添加字符串引號包圍。爲此,我們使用print以及三個參數 - >print "\"", $0, "\""

要刪除第一個領域,我們可以做到這一點in the correct way

$ echo 'Ehm, \"hi\", he \\ said' | awk '{sub(/^\S+\s*/, ""); print "\"", $0, "\""}' 
"\"hi\", he \\ said" 

如果我們只是空白,它看起來我們得到您想要的輸出是什麼:

$ echo 'Ehm, \"hi\", he \\ said' | awk '{$1=""; print "\"", $0, "\""}' 
" \"hi\", he \\ said" 
+0

爲什麼使用'sprintf'然後添加'1'來打印,當你可以使用'printf'(甚至只是'print')? –

+0

回聲只是一個例子,通常'Ehm,「嗨」,他\說''在awk處理的文件中。 awk並沒有逃脫原來變量的任何東西 –

+0

@TomFenech ha!因爲我過多地改變了我失去焦點的字符串:D – fedorqui

2

是否有你訴諸awk的原因是什麼? Bash是完全能夠執行字符串操作:

#!/bin/bash 

read -r ignored line <<<'Ehm, "hi", he \ said' 
line=${line//\\/\\\\} 
line=${line//\"/\\\"} 
echo $line 

輸出

\"hi\", he \\ said 
2

這是你在找什麼?

$ cat tst.awk 
function foo(str) { 
    sub(/^[^[:space:]]+/,"",str) # remove first field 
    gsub(/["\\]/,"\\\\&",str)  # put \ before each \ and " 
    return "\"" str "\""   # surround with quotes 
} 
{ print foo($0) } 

測試:

$ echo "Ehm, \"hi\", he \\ said" | awk -f tst.awk 
" \"hi\", he \\ said" 

$ cat file 
Ehm, "hi", he \ said 

$ awk -f tst.awk file 
" \"hi\", he \\ said"