【发布时间】:2021-03-23 17:42:52
【问题描述】:
我想编辑一个文件并将其写入最后没有 .template 的另一个位置。为此,我连续使用两个命令,这应该给我新的文件名,但 bash 不接受它。我听说你应该用反引号来做这个,但我不能让它工作(第一个 sed 是正确的,不要打扰):
sed -E '/^\s*(#.*)?$/d; s/^\s*(\S+)\s+("([^"]*)"|(\S+)).*/s\/\1\/\3\4\/g/' "$file" > `$(basename $file) | sed -E 's/(.*).template$/.translated\1/g')`
我收到这样的错误:
translate: command substitution: line 25: syntax error near unexpected token `)'
translate: command substitution: line 25: `$(basename $file) | sed -E 's/(.*).template$/.translated\1/g')'
translate: line 25: `$(basename $file) | sed -E 's/(.*).template$/.translated\1/g')`: ambiguous redirect
重定向到文件名部分应该是什么样的?
【问题讨论】:
-
>"$(basename "$file")"不那么模棱两可——注意引用。即使这样,如果file为空,也会有歧义。 -
但是,当您使用 both
>and|来重定向单个命令的标准输出时,您期望会发生什么?它只能去一个地方——一个文件或一个管道——不能同时去两者。 -
将
file_base=${file##*/}视为优先命令,然后使用类似于>"${file_base%.template}.translated"的内容。即使不是更正确,使用内置 bash parameter expansion 也比启动sed的新副本仅处理单行输入要快几个数量级。 -
Re: “应该用反引号来做这个”——反引号从不优于
$(...),这是自最初发布以来执行命令替换的标准化方式1991 年的 POSIX.2。 -
(如果你真的希望你的输出文件是一个名称以
.translated开头的隐藏文件,那么你可能想要>".translated${file_base%.template}")