【发布时间】:2018-02-03 11:09:04
【问题描述】:
我的 Bash 脚本通过 top_directory 工作,我需要相对于 top_directory 的路径,因为整个树可能会复制到其他地方。
我正在使用 sed 将路径“$TOP”从文件名 $F1 替换到 top_directory。这行得通,但是当我将 sed 命令放在倒引号中以设置 shell 变量时,我从 sed 收到错误消息。我的假设是,倒引号需要对 sed 中的一些转义进行返工。但是哪个?
脚本片段
echo $F1
echo $TOP
echo $F1 | sed "s/${TOP//\//\\/}//g;s/^\///g;s/^/\"/g;s/$/\";/g"
echo fine
RELATIVE_PATH=` echo $F1 | sed "s/${TOP//\//\\/}//g;s/^\///g;s/^/\"/g;s/$/\"/g" `
echo bad
第一个 s 删除存储在 $TOP 中的文本;第二个 s 负责前导斜杠;第三个 s 创建前导引号,最后一个创建尾随引号。
输出:
/home/felix/data/media/music/branch/20170504/Music/Frank Reid/Frank Reid plays Just for You/04 Dorney Wood - S2x40 (digitized).mp3
/home/felix/data/media/music/branch/20170504/Music
"Frank Reid/Frank Reid plays Just for You/04 Dorney Wood - S2x40 (digitized).mp3";
fine
sed: -e expression #1, char 9: unknown option to `s'
bad
我还尝试将单引号作为变量赋值的转义字符,但它失败了。还使用 sed 创建一个类似 RELATIVE_PATH=".." 的文本并将其放入 eval 失败。
【问题讨论】:
-
嗨 Luiz,我学到了两件事:我应该习惯 $( ) 语法和用于 sed 的 #;非常感谢
-
我现在使用:RELATIVE_PATH=$( echo $F1 | sed -e "s#$TOP##g;s#^/##g;" )