【问题标题】:How to convert [abc\tdef\tghi] to ["abc" "def" "ghi"] in Mac Terminal?如何在 Mac 终端中将 [abc\tdef\tghi] 转换为 ["abc" "def" "ghi"]?
【发布时间】:2021-07-26 02:26:40
【问题描述】:

我在终端中有以下变量

回显 $VAR1

abc def ghi

如何将其转换为

"abc" "def" "ghi" 中间有一个空格?

【问题讨论】:

  • 既然你是在mac上,你是用bash还是zsh?
  • 你想要一个包含引号的单个字符串,还是想要三个单独的字符串(就像一个数组一样)? (这基本上归结为:你想对结果做什么?)
  • 是的,我在 zsh 上

标签: shell zsh


【解决方案1】:

zsh 中,您可以将字符串分解为带引号的单词数组

var1=$'abc\tdef\tghi'
words=( "${(qqq)=var1}" )

如果需要的话,然后将其转回单个字符串

var2="${words[*]}"
printf "%s\n" "$var2" # prints "abc" "def" "ghi"

如果不需要,也可以跳过中间数组:

var2=${(A)${(qqq)=var1}}

【讨论】:

【解决方案2】:

假设变量包含实际的制表符(不是后跟“t”的反斜杠),您可以在扩展变量时将制表符替换为" "(请参阅here,在修饰符列表中向下),并且在开头和结尾添加引号,如下所示:

"\"${VAR1//$'\t'/\" \"}\""

这里有一个相当复杂的引用和转义模式组合。开头和结尾的双引号使整个内容成为双引号字符串,因此 shell 不会对其中的空格做任何奇怪的事情。其中的各种转义双引号都将被视为文字字符(因为它们已转义),并且只是输出的一部分。并且模式字符串 $'\t' 处于 ANSI-C 引用模式,因此 \t 被转换为实际的制表符。

这里有几个使用它的例子:

% VAR1=$'abc\tdef\tghi'    # Define a variable with actual tab characters
% echo "\"${VAR1//$'\t'/\" \"}\""   # Pass the converted version to a command
"abc" "def" "ghi"
% VAR2="\"${VAR1//$'\t'/\" \"}\""    # Store converted version in another variable
% echo "$VAR2"
"abc" "def" "ghi"

【讨论】:

    【解决方案3】:

    这可以做你想做的事

    echo -e "abc\tdef\tghi\tjhg\tmnb" | sed -ne 's/\t/" "/g; s/.*/"\0"/p'
    

    结果:

    "abc" "def" "ghi" "jhg" "mnb"
    

    【讨论】:

      【解决方案4】:

      您可以利用awk。例如:

      user$ $var='abc\tdef\tghi'
      user$ $echo -e ${var}
      (output)>>> abc def ghi
      user$ $echo -e ${var} | awk -F '\t' '{ for (i=1; i <NF; i++) {printf "\"%s\" ", $i}; printf "\"%s\"\n", $NF}' 
      (output)>>> "abc" "def" "ghi"
      

      【讨论】:

        猜你喜欢
        • 2014-08-11
        • 2017-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多