2017-02-16 53 views
1

我是shell腳本的初學者。 我有一個變量包含值=字符。 我想在=字符後的字段中添加引號。添加引號的字段分離

abc="source=TDG" 
echo $abc|awk -F"=" '{print $2}' 

我的代碼只打印一個字段。 我的預期輸出是

source='TDG' 

請幫我。

回答

3
$ abc='source=TDG' 
$ echo "$abc" | sed 's/[^=]*$/\x27&\x27/' 
source='TDG' 
  • [^=]*$比賽非=在行尾字符
  • \x27&\x27圍繞匹配文本


添加單引號隨着awk

$ echo "$abc" | awk -F= '{print $1 FS "\047" $2 "\047"}' 
source='TDG' 
  • -F=輸入字段分隔符是第一場=
  • print $1 FS "\047" $2 "\047"打印,隨後輸入字段分隔符,接着用單引號然後第二場和另一個單引號
  • 用於在打印
  • 處理單引號更多方式參見 how to escape single quote in awk inside printf


隨着bash parameter expansion

$ echo "${abc%=*}='${abc#*=}'" 
source='TDG' 
  • ${abc%=*}將刪除後的=和零個或多個字符最後一次出現
  • ${abc#*=}將刪除零個或多個字符和字符串的開頭第一=
+0

交換你在sed這樣就可以避免那些醜陋的十六進制代碼使用引號:'「‘’」' – Harvey

+1

@Harvey,同時它會在這種情況下工作,需要使用雙引號,因爲它要小心會在被傳遞給sed之前由shell解釋 – Sundeep

3

桑達將是更好的選擇:

echo "$abc" | sed "s/[^=]*$/'&'/" 

awk可以做到但需要額外的位:

echo "$abc" | awk -F= 'gsub(/(^|$)/,"\047",$2)' OFS== 
0
What is taking place? 

使用sub通過八進制nr用單引號括起TDG以避免引用問題。

echo "$abc" | awk '{sub(/TDG/,"\047TDG\047")}1' 
source='TDG' 
+1

雖然這段代碼可能回答這個問題,但提供關於爲什麼和/或它如何回答問題的附加上下文會顯着提高其長期價值。請[編輯]你的答案,添加一些解釋。 – CodeMouse92