我试图用来sed
删除一些字符并将结果返回给变量。但我似乎无法让它发挥作用。这是我尝试过的以及我得到的相应错误。
PROJECT_DB_NAME=`sed -i "${var}"'s/[^a-zA-Z]//g'`
错误 sed:-i 不能与 stdin 一起使用
PROJECT_DB_NAME=`"$var" | sed -n 's/[^a-zA-Z]//g'`
错误 domain.com:找不到命令
我找到了很多例子,但没有一个完全符合我想要做的,而且我有点像 bash 菜鸟。谢谢
答案1
您不需要sed
从 中的变量值中删除非字母字符bash
。一个简单的变量替换会做同样的事情:
PROJECT_DB_NAME=${var//[![:alpha:]]}
如果你想用[!a-zA-Z]
代替[![:alpha:]
,那当然也是可以的。
如果您确实想使用外部命令来删除这些字符,请使用更轻量级的命令tr
而不是sed
.的任务tr
正是做这些事情(单字符音译)。
PROJECT_DB_NAME=$( tr -dc '[:alpha:]' <<<"$var" )
或者,
PROJECT_DB_NAME=$( printf '%s\n' "$var" | tr -dc '[:alpha:]' )
该命令请参见手册tr
。
请注意,使用echo
可能会在看到变量之前更改其内容sed
。参见问题“为什么 printf 比 echo 更好?”。
你的第一段代码,
PROJECT_DB_NAME=`sed -i "${var}"'s/[^a-zA-Z]//g'`
将在没有文件名的情况下运行sed
。这sed
假设数据是通过标准输入到达的。正如错误消息所示,该-i
选项不能与标准输入一起使用。此外,您还可以在sed
代码前面添加变量的值。这将使变量的值被解释为sed
编辑命令。
你的第二段代码,
PROJECT_DB_NAME=`"$var" | sed -n 's/[^a-zA-Z]//g'`
"$var"
这尝试作为管道左侧的命令运行。另外,您使用sed -n
这会sed
导致不是默认输出修改后的数据。
答案2
好吧,我在这里找到了答案: 如何将sed的结果分配给变量
我看过这个答案,但最终实施错误。所以这就是我最终得到的结果:
PROJECT_DB_NAME=$( echo "$var" | sed 's/[^a-zA-Z]//g')