【问题标题】:Escaping forward slashes in sed command [duplicate]在 sed 命令中转义正斜杠 [重复]
【发布时间】:2017-04-04 12:59:15
【问题描述】:

使用BashSED 我试图用URL 替换js 文件中的两个字符串。

当我运行 .sh 脚本时,应该插入的两个 url 是输入参数。

./deploy.sh https://hostname.com/a/index.html https://hostname2.com/test

但是,要使其在我的 sed 命令中可用,我必须使用以下命令转义所有正斜杠:\\

./deploy.sh https:\\/\\/hostname.com\\/a\\/index.html https:\\/\\/hostname2.com\\/test

如果他们被转义,则此 SED 命令适用于 Mac OSX Sierra

APP_URL=$1
API_URL=$2

sed "s/tempAppUrl/$APP_URL/g;s/tempApiUrl/$API_URL/g" index.src.js > index.js

现在我不想插入转义的 url 作为参数,我希望脚本自己转义正斜杠。

这是我尝试过的:

APP_URL=$1
API_URL=$2

ESC_APP_URL=(${APP_URL//\//'\\/'})
ESC_API_URL=(${API_URL//\//'\\/'})

echo 'Escaped URLS'
echo $ESC_APP_URL
#Echos result: https:\\/\\/hostname.com\\/a\\/index.html 
echo $ESC_API_URL
#Echos result: https:\\/\\/hostname2.com\\/test

echo "Inserting app-URL and api-URL before dist"
sed "s/tempAppUrl/$ESC_APP_URL/g;s/tempApiUrl/$ESC_API_URL/g" index.src.js > index.js

参数看起来相同,但在这种情况下,SED 会抛出错误

sed: 1: "s/tempAppUrl/https:\\/\ ...": bad flag in substitute command: '\'

谁能告诉我这里的区别?字符串看起来相同,但结果不同。

【问题讨论】:

  • 这不仅仅是/s,还有很多你必须转义的字符(例如你当前正则表达式中的.s),但对于大多数人来说,sed 不会给你一个错误消息其中,它只会破坏你的输出。见stackoverflow.com/questions/29613304/…。如果您想学习如何进行健壮的字符串替换,请发布一个新问题(由于 sed 不支持字符串,因此答案将不会被 sed!)。

标签: bash shell sed


【解决方案1】:

我建议更换

sed "s/regex/replace/" file

sed "s|regex|replace|" file

如果您的 sed 支持它。那么就不再需要转义斜线了。

s 之后的字符决定了哪个字符是分隔符,在s 命令中必须出现 3 次。

【讨论】:

  • 嗯,SED 通过但结果错误。 https:\/\/hostname.com\/a\/index.html
  • 如果你的 sed 支持它?这不是自那个时代以来任何 sed 的特性吗?
  • 当使用| 作为分隔符时,你不需要转义斜线。您的ESC_APP_URL=(${APP_URL//\//'\\/'}) 行是完全不必要和错误的。
猜你喜欢
  • 2020-12-22
  • 1970-01-01
  • 2023-01-05
  • 2018-02-07
  • 2022-01-07
  • 2012-11-04
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多