正确转义 bash 脚本中的正斜杠以与 sed 一起使用

use*_*839 15 linux bash rsync sed bash-scripting

我试图通过在干模式下运行 rsync 来确定在同步两个文件夹时新复制的文件的大小,然后总结 rsync 输出中列出的文件的大小。

目前我被困在文件的父文件夹前缀上。我发现了如何使用 sed 为行添加前缀以及如何使用 sed 进行转义,但是我在将这两者结合起来时遇到了麻烦。

这是我走了多远:

source="/my/source/folder/"
target="/my/target/folder/"
escaped=`echo "$source" | sed -e 's/[\/&]/\\//g'`
du `rsync -ahnv $source $target | tail -n +2 | head -n -3 | sed "s/^/$escaped/"` | awk '{i+=$1} END {print i}'
Run Code Online (Sandbox Code Playgroud)

这是我从 bash -x myscript.sh 得到的输出

+ source=/my/source/folder/
+ target=/my/target/folder
++ echo /my/source/folder/
++ sed -e 's/[\/&]/\//g'
+ escaped=/my/source/folder/
+ awk '{i+=$1} END {print i}'
++ rsync -ahnv /my/source/folder/ /my/target/folder/
++ sed 's/^//my/source/folder//'
++ head -n -3
++ tail -n +2
sed: -e expression #1, char 8: unknown option to `s'
+ du
80268
Run Code Online (Sandbox Code Playgroud)

任何有关如何正确逃脱的想法都将受到高度赞赏。

jjl*_*lin 30

您实际上不需要费心转义/. 从GNUsed手册

/在任何给定s命令中,这些字符可以统一替换为任何其他单个字符。

例如:

echo 'foobar' | sed -e 's#foo#bar#'
Run Code Online (Sandbox Code Playgroud)

给出输出

barbar
Run Code Online (Sandbox Code Playgroud)

  • 这应该是 sed 手册页中的第一件事 (4认同)