[英]How can I use sed to change my target dir in this shell command line?
[英]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
至于解决问题的方法,可以使用注释中提到的subshell扩展。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.