说我有这个:
str="@test/string"
echo $str
@test/string
echo ${str#@}
test/string
按预期工作,但是
echo ${str//\//-}
ksh: ${str//\//-}: bad substitution
失败。(预期@test-string)
替换/替换这样的字符的正确方法是什么?
echo $KSH_VERSION
KSH version @(#)PD KSH v5.2.14 99/07/13.2
说我有这个:
str="@test/string"
echo $str
@test/string
echo ${str#@}
test/string
按预期工作,但是
echo ${str//\//-}
ksh: ${str//\//-}: bad substitution
失败。(预期@test-string)
替换/替换这样的字符的正确方法是什么?
echo $KSH_VERSION
KSH version @(#)PD KSH v5.2.14 99/07/13.2
该
pdksh
外壳是 OpenBSD 等新用户的默认外壳,没有您提到的非标准参数替换。要用一些新字符串替换某些模式的所有非重叠匹配项,您可以使用
sed
:请注意,这用作
PATTERN
POSIX 基本正则表达式,REPLACEMENT
必须 escape&
和\1
其他sed
将以特殊方式解释的字符串,并且命令替换从字符串末尾删除所有尾随换行符。例子:
在这种情况下,当仅替换单个字符时,可以将替换替换
sed
为y/\//-/
,或者将整个sed
命令替换为tr
命令tr / -
。您也可以选择编写一个 shell 循环:
在此代码中,
PATTERN
是一个 shell 模式(“文件名通配模式”)。代码用替换字符串重复替换字符串中模式的第一个匹配项,直到没有更多匹配项为止。由于循环,无法保证以后的迭代不会在先前插入的替换字符串中执行替换。例子:
Yes
${var//pattern/replacement}
是 ksh93 运算符,而 pdksh 是 ksh88 的克隆。pdksh 作为一个项目已经停止,但它仍然存在,因为它是sh
一些 BSD 的项目,包括 OpenBSD 和 MirBSD。MirBSD sh/ksh 也称为 mksh,也作为可移植的 shell 进行维护,并且在许多 Linux 发行版中都可用。它确实在 2008 年的 R33 版本中添加了 ksh93 运算符。POSIXly,要用变量中的另一个字符替换一个字符,您可以使用
tr
ansliterator 实用程序,但您需要将变量的内容提供到其标准输入并从其标准输出中获取结果:(添加
.\n
以解决命令替换去除尾随换行符的事实)。您还可以使用 split+glob 运算符来避免运行单独的命令:
一定是更好的方法,但是: