繁体   English   中英

如何在sed中使用Shell通配符?

[英]How can I use a shell wildcard in sed?

我正在尝试在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

至于解决问题的方法,可以使用注释中提到的subshel​​l扩展。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM