如何用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 }