gpt4 book ai didi

bash - 如何在 sed 中使用 shell 通配符?

转载 作者:行者123 更新时间:2023-12-04 04:37:34 25 4
gpt4 key购买 nike

我正在尝试在 sed 中使用 shell 通配符。以下失败。 (我希望 foo 作为输出。)

$ touch foo
$ ls
foo
$ echo *
foo
$ bar=*
$ echo $bar
foo
$ echo "$bar"
*
$ echo replace | sed "s/replace/${bar}/"
*
$ echo replace | sed "s/replace/"${bar}"/"
*

正如预期的那样,倒数第二个命令不会产生 foo , 自 ${bar}被(双)引用。但是,我希望最后一个命令可以扩展通配符。

不过,我可以在以下任一命令后工作。
bar=$(echo *)

此外,我预计以下 shell 通配符扩展不会发生。
$ echo replace | sed s/replace/*/
*

但是,这是有效的。
$ echo replace | sed s/replace/$(echo *)/
qwe

最佳答案

您的最后一个命令确实尝试扩展通配符,但它失败了。来自 man bash :

 Pathname Expansion
After word splitting, unless the -f option has been set, bash
scans each word for the characters *, ?, and [. If one of these
characters appears, then the word is regarded as a pattern, and
replaced with an alphabetically sorted list of file names matching
the pattern.

正如它所说,bash 尝试扩展每个包含 * 的单词。到匹配的文件名。在您的情况下,它尝试扩展为以 s/replace/ 开头的文件名。并且没有这样的文件。为了证明这一点:
$ echo "aaaa" | sed "s@a@*@g"
****

$ echo "aaaa" | sed "s@a@"*"@g"
****

$ touch s@a@b@g

$ echo "aaaa" | sed "s@a@*@g"
****

$ echo "aaaa" | sed "s@a@"*"@g"
bbbb

至于您的问题的解决方案,您可以使用评论中提到的子 shell 扩展。

关于bash - 如何在 sed 中使用 shell 通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19476560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com