使用 sed 命令返回变量

使用 sed 命令返回变量

我试图用来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')

相关内容