在 Linux shell 上将字符串转换为数组中的单引号的有效方法

在 Linux shell 上将字符串转换为数组中的单引号的有效方法

案例示例:

Array=( "Mary" "had a __SingleQuote__little__SingleQuote__" "lamb" )
for i in "${Array[@]}"; do echo "$i"; done
Mary
had a __SingleQuote__little__SingleQuote__
lamb

我想要转变将字符串__SingleQuote__转换为单引号 '字符,所以数组将是:

ConvertedArray=( "Mary" "had a 'little'" "lamb" )
for i in "${ConvertedArray[@]}"; do echo "$i"; done
Mary
had a 'little'
lamb

也许是这样的:

ConvertedArray=( "$(echo ${Array[@]} | sed s/___SingleQuote__/\'/ )" )

但这个命令会产生错误的结果:

Array=( "Mary" "had a __SingleQuote__little__SingleQuote__" "lamb" )
ConvertedArray=( "$(echo ${Array[@]} | sed s/___SingleQuote__/\'/ )" )
for i in "${ConvertedArray[@]}"; do echo "$i"; done
Mary had a __SingleQuote__little__SingleQuote__ lamb

是什么正确的命令在 Linux shell 上执行此操作(如果解决方案需要具体,则使用 Bash)?

我可以实现一个循环,但数组可能很长,所以效率当使用 shell 工具时是首选。

已测试:

  • 命令tr,但它是一个字符一个字符地音译的。
  • 'sed' 命令,但我在处理 'sed' 语法所需的单引号时遇到问题。

答案1

在 中bash,您应该能够逐个元素对数组应用全局参数替换:

$ Array=( "Mary" "had a __SingleQuote__little__SingleQuote__" "lamb" )
$ ConvertedArray=( "${Array[@]//__SingleQuote__/\'}" )
$ printf '%s\n' "${ConvertedArray[@]}"
Mary
had a 'little'
lamb

参见示例搜索和替换:数组

答案2

当然,这会打印你所要求的内容:

printf '%s\n' "${Array[@]//__SingleQuote__/\'}"

但既然您要求一个具有正确值的新数组,则使用:

ConvertedArray=( "${Array[@]//__SingleQuote__/\'}" )

当然,ConvertedArray 的索引将从 0 开始为数字。这似乎不是问题,但既然您在评论中提到了它(在其他答案上),请继续阅读。


稀疏数组

如果数组定义为:

$ Array=( [2]="Mary" [5]="had a __SingleQuote__little__SingleQuote__" [8]="lamb" )

那么数组是稀疏的(有一些漏洞):

$ declare -p Array
declare -a Array=([2]="Mary" [5]="had a __SingleQuote__little__SingleQuote__" [8]="lamb")

为了解决这个问题,你需要一个循环:

$ for i in "${!Array[@]}"; do
>     ConvertedArray[i]="${Array[i]//__SingleQuote__/\'}"
> done
$ declare -p ConvertedArray
declare -a ConvertedArray=([2]="Mary" [5]="had a 'little'" [8]="lamb")

$ printf '%s\n' "${ConvertedArray[@]}"
Mary
had a 'little'
lamb    

答案3

我假设您想在中执行此操作bash(或者您不会使用数组来开始)。

$ echo "${Array[@]//__SingleQuote__/\'}"
Mary had a 'little' lamb
$ printf '%s\n' "${Array[@]//__SingleQuote__/\'}"
Mary
had a 'little'
lamb
$ ConvertedArray=( "${Array[@]//__SingleQuote__/\'}" )
$ printf '%s\n' "${ConvertedArray[@]}"
Mary
had a 'little'
lamb

上面使用模式替换${parameter//pattern/text}将所有出现的 替换__SingleQuote__为单引号。当应用于数组时,将单独对每个元素执行该操作。


在 POSIX shell 中,我们只有一个数组$@

set -- "Mary" "had a __SingleQuote__little__SingleQuote__" "lamb"

i=0
while [ "$i" -ne "$#" ]; do
    set -- "$@" "$( printf '%s\n' "$1" | sed "s/__SingleQuote__/'/g" )"
    shift
    i=$(( i + 1 ))
done

printf '%s\n' "$@"

sed这通过输入每个单独的参数以将占位符字符串转换为单引号字符来修改位置参数集。它对第一个位置参数进行修改并将结果添加到 的末尾$@。然后它将第一个参数从数组中移出并重复,直到所有元素都已处理完毕。

上面会产生

Mary
had a 'little'
lamb

相关内容