我有一个Visual Studio项目,它是在本地开发的.必须将代码文件部署到远程服务器.唯一的问题是URLsthey包含硬编码.
项目包含URL,例如?page = one.要使链接在服务器上有效,它必须是/ page/one.
我决定在部署之前用sed替换我的代码文件中的所有URL,但是我坚持使用斜杠.
我知道这不是一个漂亮的解决方案,但它很简单会省去很多时间.我必须替换的字符串总数小于10.必须检查的文件总数约为30.
描述我的情况的示例如下:
我正在使用的命令:
sed -f replace.txt < a.txt > b.txt
Run Code Online (Sandbox Code Playgroud)
replace.txt包含所有字符串:
s/?page=one&/pageone/g
s/?page=two&/pagetwo/g
s/?page=three&/pagethree/g
Run Code Online (Sandbox Code Playgroud)
A.TXT:
?page=one&
?page=two&
?page=three&
Run Code Online (Sandbox Code Playgroud)
运行sed命令后b.txt的内容:
pageone
pagetwo
pagethree
Run Code Online (Sandbox Code Playgroud)
我希望b.txt包含:
/page/one
/page/two
/page/three
Run Code Online (Sandbox Code Playgroud)
lur*_*ker 259
最简单的方法是在搜索/替换行中使用不同的分隔符,例如:
s:?page=one&:pageone:g
Run Code Online (Sandbox Code Playgroud)
您可以将任何字符用作不属于任一字符串的分隔符.或者,你可以用反斜杠来逃避它.
Tom*_*son 95
该s命令可以使用任何字符作为分隔符; s使用后的任何角色.我长大了用一个#.像这样:
s#?page=one&#/page/one#g
Run Code Online (Sandbox Code Playgroud)
Joh*_*nck 59
关于sed的一个非常有用但鲜为人知的事实是熟悉的s/foo/bar/命令可以使用任何标点符号,而不仅仅是斜杠.一个常见的替代方案是s@foo@bar@,从中可以明显地解决您的问题.
在特殊字符之前添加\
s/\?page=one&/page\/one\//g
Run Code Online (Sandbox Code Playgroud)
等等
小智 5
在我正在开发的系统中,要用sed替换的字符串是来自用户的输入文本,该文本存储在变量中并传递给sed。
如本文前面所述,如果sed命令块中包含的字符串包含sed使用的实际分隔符-则sed会在语法错误时终止。考虑以下示例:
这有效:
$ VALUE=12345
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345
Run Code Online (Sandbox Code Playgroud)
这打破了:
$ VALUE=12345/6
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
sed: -e expression #1, char 21: unknown option to `s'
Run Code Online (Sandbox Code Playgroud)
在我的情况下,替换默认的分隔符并不是一个可靠的解决方案,因为我不想限制用户输入sed用作分隔符的特定字符(例如“ /”)。
但是,转义在输入字符串中出现的定界符将解决该问题。考虑以下解决方案,在通过sed解析输入字符串之前,系统地转义分隔符。可以使用sed本身将这种转义实现为替换,即使输入字符串包含定界符,这种替换也是安全的-这是因为输入字符串不属于sed命令块的一部分:
$ VALUE=$(echo ${VALUE} | sed -e "s#/#\\\/#g")
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345/6
Run Code Online (Sandbox Code Playgroud)
我已经将此转换为各种脚本要使用的功能:
escapeForwardSlashes() {
# Validate parameters
if [ -z "$1" ]
then
echo -e "Error - no parameter specified!"
return 1
fi
# Perform replacement
echo ${1} | sed -e "s#/#\\\/#g"
return 0
}
Run Code Online (Sandbox Code Playgroud)