sed /PATTERN/SUB/ $VAR?

die*_*ces 2 bash sed variable-substitution

我正在重命名一些文件。

这有效:
ls | while IFS= read -r line; do name=$(echo $line | sed -e 's/\(.*\)/\1.jpg/') && mv $line $name; done

没关系,但我想让它更简洁,例如:
ls | while IFS= read -r line; do name=$(sed -e 's/\(.*\)/\1.jpg/' $line) && mv $line $name; done

后一个例子和各种类似的尝试将文件传递给 sed 而不是变量的值。

使用 ˋ $lineˋ 和$($line)两者都会导致尝试执行文件。而变化"$line"'line'有和没有<,都会导致文件中读取。这是怎么回事?$line为此,变量可以直接与 sed 一起使用吗?

Kus*_*nda 7

看起来像你只是想追加.jpg到当前目录中的文件的所有名字的结尾。如果是这种情况,那么有更简单的方法:

for f in ./*; do
  mv -- "$f" "$f.jpg"
done
Run Code Online (Sandbox Code Playgroud)

--确保与初始破折号(文件名-)不解释为选项mv。这在这里不是问题,因为我们还确保$f始终./在开始时通过./*在循环中使用路径。

from 的输出ls用于眼睛阅读,通常不适合像您正在做的那样发送到 while-read-loop 中。

是的,在您的第二个示例 ( sed -e 's/\(.*\)/\1.jpg/' $line) 中,文件的内容将由sed. 使用 Bash,您可以sed '...' <<<"$line"改为这样做。该<<<"string"构造是一个 Bash 扩展(至少也可在ksh和 中使用zsh),称为“here-string”,它将标准输入中的字符串传递给命令。