【问题标题】:Field separation with adding quotes添加引号的字段分隔
【发布时间】:2017-07-05 15:18:38
【问题描述】:

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

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

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

source='TDG'

【问题讨论】:

    标签: linux bash shell awk sed


    【解决方案1】:
    $ 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#*=} 将从字符串开头删除零个或多个字符和第一个 =

    【讨论】:

    • 在 sed 中交换你对引号的使用,这样你就可以避免那些丑陋的十六进制代码:" ' ' "
    • @Harvey 虽然它可以在这种情况下工作,但需要小心使用双引号,因为它会在传递给 sed 之前由 shell 解释
    【解决方案2】:

    Sed 会是更好的选择:

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

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

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

    【讨论】:

      【解决方案3】:
      What is taking place?
      

      使用 sub 将 TDG 用八进制 nr 单引号括起来以避免引用问题。

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

      【讨论】:

      • 虽然此代码可以回答问题,但提供有关它为什么和/或如何回答问题的额外上下文将显着提高其长期价值。请edit你的答案添加一些解释。
      猜你喜欢
      • 2017-06-14
      • 2012-09-28
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2013-12-06
      • 2021-04-19
      • 2022-11-24
      相关资源
      最近更新 更多