如何在 Mac 终端中将 [abc\tdef\tghi] 转换为 ["abc" "def" "ghi"]?

How to convert [abc\tdef\tghi] to ["abc" "def" "ghi"] in Mac Terminal?

我在终端中有以下变量

回显 $VAR1

abc def ghi <- Separated by tab

如何将其转换为

"abc" "def" "ghi" with single space in-between?

这可以做你想做的事

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

结果:

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

您可以利用 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"

zsh 中,您可以使用

将您的字符串分解成一个引用词数组
var1=$'abc\tdef\tghi'
words=( "${(qqq)=var1}" )

如果需要,然后使用

将其变回单个字符串
var2="${words[*]}"
printf "%s\n" "$var2" # prints "abc" "def" "ghi"

或者,如果不需要,则跳过中间数组:

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

假设变量包含实际的制表符(不是反斜杠后跟“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"