如何用sedreplace包含斜杠的string?
我有一个Visual Studio项目,这是在本地开发的。 代码文件必须部署到远程服务器。 唯一的问题是URLsthey包含哪些是硬编码的。
项目包含URLS,例如?page = 1 。 要使链接在服务器上有效,它必须是/ page / one 。
我决定在部署之前用sedreplace我的代码文件中的所有URL,但是我被困在了斜杠上。
我知道这不是一个漂亮的解决scheme,但它很简单会节省我很多时间。 我要replace的string总数less于10个。必须检查的文件总数是〜30个。
描述我的情况的例子如下:
我正在使用的命令:
sed -f replace.txt < a.txt > b.txt
包含所有string的replace.txt:
s/?page=one&/pageone/g s/?page=two&/pagetwo/g s/?page=three&/pagethree/g
A.TXT:
?page=one& ?page=two& ?page=three&
我运行我的sed命令后b.txt的内容:
pageone pagetwo pagethree
我想要b.txt包含:
/page/one /page/two /page/three
最简单的方法是在search/replace行中使用不同的分隔符,例如:
s:?page=one&:pageone:g
您可以使用任何字符作为不属于任何string的分隔符。 或者,你可以用一个反斜杠来逃避它。
s
命令可以使用任何字符作为分隔符; 在使用s
之后,不pipe字符是什么。 我被带到使用#
。 像这样:
s#?page=one&#/page/one#g
关于sed的一个非常有用但鲜为人知的事实是熟悉的s/foo/bar/
命令可以使用任何标点符号,而不仅仅是斜杠。 一个常见的select是s@foo@bar@
,从中可以看出如何解决你的问题。
在特殊字符前加\
s/\?page=one&/page\/one\//g
等等
这一行应该为你的3个例子工作:
sed -r 's#\?(page)=([^&]*)&#/\1/\2#g' a.txt
- 我用
-r
来保存一些逃跑。 - 该行应该是通用的,你的一个,两个三个的情况。 你不需要做3次
testing你的例子(a.txt):
kent$ echo "?page=one& ?page=two& ?page=three&"|sed -r 's#\?(page)=([^&]*)&#/\1/\2#g' /page/one /page/two /page/three
来自Anonymous的很好的回答。 \我解决了我的问题,当我试图在HTMLstring中脱离引号。
因此,如果您使用sed返回一些HTML模板(在服务器上),请使用双反斜杠而不是单个:
var htmlTemplate = "<div style=\\"color:green;\\"></div>";
应该是replace.txt
s/?page=/\/page\//g s/&//g
在我开发的系统中,被sedreplace的string是从用户input的文本,存储在一个variables中并传递给sed。
如前所述,如果sed命令块中包含的string包含sed所使用的实际分隔符,那么sed将终止语法错误。 考虑下面的例子:
这工作:
$ VALUE=12345 $ echo "MyVar=%DEF_VALUE%" | sed -es/%DEF_VALUE%/${VALUE}/g MyVar=12345
这打破了:
$ VALUE=12345/6 $ echo "MyVar=%DEF_VALUE%" | sed -es/%DEF_VALUE%/${VALUE}/g sed: -e expression #1, char 21: unknown option to `s'
replace默认的分隔符不是一个健壮的解决scheme,因为我不想限制用户input由sed用作分隔符的特定字符(例如“/”)。
但是,在inputstring中跳出任何分隔符都可以解决问题。 考虑下面的解决scheme,在通过sedparsing之前,系统地在inputstring中转义分隔符。 这样的转义可以通过使用sed本身的替代来实现,即使inputstring包含分隔符,这种replace也是安全的 – 这是因为inputstring不是sed命令块的一部分:
$ VALUE=$(echo ${VALUE} | sed -e "s#/#\\\/#g") $ echo "MyVar=%DEF_VALUE%" | sed -es/%DEF_VALUE%/${VALUE}/g MyVar=12345/6
我已经将其转换为一个函数供各种脚本使用:
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 }