【问题标题】:sed command produces error when output reused (Escaping)sed 命令在输出重用时产生错误(转义)
【发布时间】: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;" )

标签: bash sed escaping


【解决方案1】:

Sed 允许使用与“/”不同的字符作为表达式分隔符:s#pattern#subst#g。所以你的命令会更简单,因为你摆脱了 $TOP 变量中的转义和字符串替换

TOP='/aa/bb'; relative=$(echo "/aa/bb/cc" | sed -e "s#$TOP##g;"' s#^/##g; s#^#"#g; s#$#"#g'); echo $relative "cc"

此外,$( ) 比反引号 ` 更具可读性。

更简单,因为你仍然会得到一个带引号的字符串

TOP='/aa/bb'; relative=$(echo "/aa/bb/cc" | sed -e "s#$TOP##g;"' s#^/##g;'); echo "'$relative'" 'cc'

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 2021-12-09
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2020-01-30
    • 2018-12-06
    相关资源
    最近更新 更多