Sed 没有在变量中扩展 *

Posted

技术标签:

【中文标题】Sed 没有在变量中扩展 *【英文标题】:Sed not expanding * in variables 【发布时间】:2021-02-17 23:16:58 【问题描述】:

我正在编写一个涉及带有通配符的路径的脚本。我知道通配符只会匹配一个文件,我只是提前不知道文件扩展名是什么,所以我使用了通配符。

这里的目标是找到相应文件的路径,然后将该路径添加到脚本的第 16 行。

我有这样的事情:

path=/path/to/somewhere/fileName*

sed "16 a file=$path" myScript.sh

我期望得到的是这个(第 16 行):

file=/path/to/somewhere/fileName.extension

但我得到的是:

file=/path/to/somewhere/fileName*

由于某种原因,sed 在添加 $path 的内容时没有扩展通配符,我不知道如何让 sed 做这样的事情。我正在寻找一种解决方案,a) sed 已正确扩展 $path 或 b) 在传递给 sed 之前让 $path 包含完全扩展的字符串。

【问题讨论】:

【参考方案1】:

您的变量只包含一个字符串,然后您插入该字符串。 sed 不知道这不是你的意思。如果您希望 shell(不是 sed!)扩展通配符,可能使用循环。

for path in /path/to/somewhere/fileName*; do
   if [ -e "$path" ]; then   # handle wildcard possibly not matching
      sed "16 a file=$path" myScript.sh
   fi
done

不清楚如果通配符匹配多个文件会发生什么;也许您想在 fi 之前添加一个 break 以仅在发生这种情况时替换第一个。

【讨论】:

计算机可能不知道这一点,所以代码应该做正确的事情,即使它不知道。 很好地理解了我认为的解决方案,我现在已将其删除,因为它不正确。 循环是一个有趣的解决方案。有没有更简单的方法让 bash 扩展/插入字符串? 你可以把它放在一个数组中,例如。 @user1934428 不,这不正确。 ideone.com/di5VT9【参考方案2】:

这可能对你有用(GNU sed、echo 和 bash):

export path='/path/toSomeWhere/filename*'
sed '16s/$/\na file=$(echo $path)/;s/.*/echo "&"/e' file

导出已设置为/path/toSomeWhere/filename* 的变量path(注意单引号会阻止插值)。

file 的第 16 行附加一行 a file=$(echo $path),然后用双引号将这两行括起来,并在 echo 命令前面加上表达式(第二个替换命令上的 e 标志)。

替代方案:

sed '17e echo "a file=$(echo /path/toSomeWhere/filename*)"' file

【讨论】:

以上是关于Sed 没有在变量中扩展 *的主要内容,如果未能解决你的问题,请参考以下文章

在 SED 中使用变量 [重复]

如何在 sed 的命令中使用变量?

sed在替换的时候,使用变量中的值?如何在sed实现变量的替换?获取到变量中的值?

使用各种扩展名重命名文件

sed

sed正则中使用变量问题