通过添加引号进行字段分隔

时间:2017-02-16 13:22:20

标签: linux bash shell awk sed

我是shell脚本的初学者。 我有一个变量包含值= character。 我想在= Character之后的字段中添加引号。

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

我的代码只打印一个字段。 我的预期输出是

source='TDG'

请帮帮我。

3 个答案:

答案 0 :(得分: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#*=}将从字符串
  • 开始删除零个或多个字符以及第一个=

答案 1 :(得分:3)

Sed会是更好的选择:

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

Awk可以做到但需要额外的位:

echo "$abc" | awk -F= 'gsub(/(^|$)/,"\047",$2)' OFS==

答案 2 :(得分:0)

What is taking place?

使用sub用单引号括起TDG的八进制数,以避免引用问题。

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