String 为什么子字符串提取提取整个单词而不是字符?

String 为什么子字符串提取提取整个单词而不是字符?,string,substring,zsh,parameter-expansion,String,Substring,Zsh,Parameter Expansion,给定一个文件test.txt,其内容为,这是一个测试。我想使用命令提取其内容的子字符串,更具体地说是第二个和第三个字符(hi) echo ${$(cat test.txt):1:2} 但是,这会输出第二个和第三个单词(是一个),而不是单个字符 我能行 a=$(cat test.txt) echo ${a:1:2} 它的工作原理与预期一致。但我想用一个命令来完成 有人能解释一下这里发生了什么并提供解决方案吗 编辑: 系统正在运行zsh。无法准确解释那里发生了什么,但您可以使用sed作为替代:

给定一个文件
test.txt
,其内容为
,这是一个测试。
我想使用命令提取其内容的子字符串,更具体地说是第二个和第三个字符(
hi

echo ${$(cat test.txt):1:2}
但是,这会输出第二个和第三个单词(
是一个
),而不是单个字符

我能行

a=$(cat test.txt)
echo ${a:1:2}
它的工作原理与预期一致。但我想用一个命令来完成

有人能解释一下这里发生了什么并提供解决方案吗

编辑:


系统正在运行zsh。

无法准确解释那里发生了什么,但您可以使用
sed
作为替代:

sed -E 's/.(..).*/\1/' test.txt

在我的机器(Debian和bash 4.4)上,这只会产生一个“错误替换”错误。它可能没有正式运作。首先,在第一个表达式中的大括号内使用$(替换),而在第二个表达式中不使用$(替换)。抱歉,伙计们,我忽略了系统运行的是zsh而不是bash。@JimDanner你说得对。显然,zsh是唯一一个可以进行嵌套替换的shell,但我仍然不明白为什么我这样做会导致观察到的行为。我正在尝试解决一个黑客挑战,为此我不能在[;|&`\'”]中使用字符。这就是为什么我想使用子字符串扩展命令