如何用sed替换包含斜杠的字符串?

afa*_*f12 132 sed

我有一个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)

您可以将任何字符用作不属于任一字符串的分隔符.或者,你可以用反斜杠来逃避它.

  • 很棒的答案!非常感谢! (3认同)
  • 不能比这更简单.谢谢. (2认同)

Tom*_*son 95

s命令可以使用任何字符作为分隔符; s使用后的任何角色.我长大了用一个#.像这样:

s#?page=one&#/page/one#g
Run Code Online (Sandbox Code Playgroud)

  • OS X上的BSD的手册页说明了*s*命令:*替换模式空间中正则表达式的第一个实例的替换字符串.可以使用除反斜杠或换行符之外的任何字符而不是斜杠来分隔RE和替换.*我敢打赌,GNU sed的手册页说的类似. (5认同)

Joh*_*nck 59

关于sed的一个非常有用但鲜为人知的事实是熟悉的s/foo/bar/命令可以使用任何标点符号,而不仅仅是斜杠.一个常见的替代方案是s@foo@bar@,从中可以明显地解决您的问题.


Ilj*_*lja 7

在特殊字符之前添加\

s/\?page=one&/page\/one\//g
Run Code Online (Sandbox Code Playgroud)

等等

  • 我可能已经错过了一些东西,但我已经尝试了这个并且似乎没有用.这似乎是显而易见的尝试,但假设我是对的,它确实不起作用,为什么发布它? (4认同)
  • @codenoob(以及到达这里的其他任何人)-开头必须为's'。s / foo \ / bar / foo_bar /可以,但是/ foo \ / bar / foo_bar /不能。 (3认同)

小智 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)