2015-01-21 61 views
0

我試圖替換以下字符串例如: 從AWK與如果條件

['55',2,1,10,30,23], 

['55',2,555,10,30,23], 

OR

['55',2,1,10,30,23], 

['55',2,1,10,9999,23], 

我四處搜尋,找到這個:

$ echo "[55,2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if($1=="[55"){$2=10}{print}}'  

[55,10,1,10,30,23], 

,但它不是我的情況下工作,因爲我如果條件有「'」周圍$ 1的值:

$ echo "['55',2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if($1=="['55'"){$2=10}{print}}' 

['55',2,1,10,30,23], 
+2

解釋這背後的邏輯? – 2015-01-21 09:33:39

回答

1

問題不在於awk代碼,它是shell擴展。單引號外殼字符串中不能有單引號。當您嘗試將輸入字符串放入單引號時,會遇到同樣的問題:

$ echo '['55',2,1,10,30,23],' 
[55,2,1,10,30,23], 

- 單引號消失!這是有道理的,因爲他們的工作是引用[,2,1,10,30,23],55這裏沒有引用),但這不是我們想要的。

一個解決辦法是單獨引用部分之間並手動擠壓它們:

$ echo '['\''55'\'',2,1,10,30,23],' 
['55',2,1,10,30,23], 

或者說,在這個特殊的情況下,如果沒有什麼邪惡的就是單引號應該是之間,

echo '['\'55\'',2,1,10,30,23],' # the 55 is now unquoted. 

應用到你的awk代碼,看起來像這樣:

$ echo "['55',2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if($1=="['\'55\''"){$2=10}{print}}' 
['55',10,1,10,30,23], 

或者,因爲這看起來不是很漂亮,如果你在你的代碼中的許多單引號,您可以編寫代碼AWK到一個文件,說foo.awk,並使用

echo "['55',2,1,10,30,23]," | awk -F, -f foo.awk 

那麼你不必擔心awk代碼中的shell引用錯誤,因爲awk代碼不再受shell擴展。

+0

謝謝工作很好的人。 – 2015-01-22 11:53:12

0

我認爲如何匹配和替換對你來說不是問題。您遇到的問題是,如何在字段中匹配單引號'

爲了避免逃避你的代碼各',並讓你的代碼更易讀,可以assigen報價給一個變量,並在你的代碼使用變量,例如像這樣:

echo "['55' 1 
['56' 1"|awk -v q="'" '$1=="["q"55"q{$2++}7' 
['55' 2 
['56' 1 

在上面的例子中,只有符合['55',第二個字段得到增加。