Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash sed命令在重用输出(转义)时产生错误_Bash_Sed_Escaping - Fatal编程技术网

Bash sed命令在重用输出(转义)时产生错误

Bash sed命令在重用输出(转义)时产生错误,bash,sed,escaping,Bash,Sed,Escaping,我的Bash脚本通过top_目录工作,我需要相对于top_目录的路径,因为整个树可能被复制到其他地方 我正在使用sed替换文件名$F1到TOP_目录的路径“$TOP”。这是可行的,但当我将sed命令放在倒引号中以设置shell变量时,sed会出错。我的假设是,反向引用需要对sed中的一些转义进行返工。但是哪个呢 脚本片段 echo $F1 echo $TOP echo $F1 | sed "s/${TOP//\//\\/}//g;s/^\///g;s/^/\"/g;s/$/\";/g" echo

我的Bash脚本通过top_目录工作,我需要相对于top_目录的路径,因为整个树可能被复制到其他地方

我正在使用sed替换文件名$F1到TOP_目录的路径“$TOP”。这是可行的,但当我将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创建前导引号,最后一个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中失败。

sed允许使用不同于“/”的字符作为表达式分隔符:
s#pattern#subst#g
。因此,您的命令将更简单,因为您在$TOP变量中去掉了转义和字符串替换

TOP='/aa/bb';相对=$(echo)/aa/bb/cc“| sed-e”s#$TOP###g;“'s#^/##g;s#^#”#g;s#$##“#g”);echo$relative
“抄送”

另外,$()比backticks更具可读性

更简单的是,仍然有一个带引号的字符串

TOP='/aa/bb';相对=$(echo/aa/bb/cc“| sed-e”s#$TOP###g;“'s#^/##g;”);回显“$relative”

“cc”

嗨,Luiz,我学到了两件事:我应该习惯$()语法和#for sed;现在很多人使用:RELATIVE_PATH=$(echo$F1 | sed-e“s#$TOP#g;s#^/###g;)