听话的棒棒糖 · 如何将有逗号分隔符的CSV文件转换成只有空格 ...· 2 周前 · |
失落的汽水 · Excel公式提取最后一个分隔符右边的数据_ ...· 2 周前 · |
捣蛋的长颈鹿 · C#几种截取字符串的方法(split ...· 2 周前 · |
调皮的石榴 · 使用 String.Split 分割字串 ...· 2 周前 · |
发呆的茴香 · js去除字符串空格(空白符)_js字符串去除 ...· 1 周前 · |
慷慨的丝瓜 · TabHost已经被弃用。· 8 月前 · |
爱运动的手电筒 · Tip和菜单的实现方式 - snandy ...· 1 年前 · |
闯红灯的雪糕 · flowable过程意见 - ...· 1 年前 · |
眼睛小的大白菜 · Time Travel Debugging ...· 1 年前 · |
我有一个本地开发的Visual Studio项目。代码文件必须部署到远程服务器。唯一的问题是它们包含的URL是硬编码的。
该项目包含诸如
?page=one
之类的URLS。要使链接在服务器上有效,它必须是
/page/one
。
我已经决定在部署之前用sed替换代码文件中的所有URLS,但我被斜杠卡住了。
我知道这不是一个很好的解决方案,但它很简单,可以节省我很多时间。我必须替换的字符串总数少于10个。必须检查的文件总数为~30个。
下面是描述我的情况的例子:
我正在使用的命令:
sed -f replace.txt < a.txt > b.txt
包含所有字符串的
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
最简单的方法是在搜索/替换行中使用不同的分隔符,例如:
s:?page=one&:pageone:g
您可以使用不属于这两个字符串的任何字符作为分隔符。或者,您可以使用反斜杠对其进行转义:
s/\//foo/
这将用
foo
取代
/
。在不知道替换字符串中可能出现哪些字符的情况下(例如,如果它们是shell变量),您可能希望使用转义反斜杠。
s
命令可以使用任何字符作为分隔符;使用
s
之后的任何字符。我从小就被教育使用
#
。如下所示:
s#?page=one&#/page/one#g
在特殊字符前添加\:
s/\?page=one&/page\/one\//g
等。
关于sed,一个非常有用但鲜为人知的事实是,熟悉的
s/foo/bar/
命令可以使用任何标点符号,而不仅仅是斜杠。一种常见的替代方案是
s@foo@bar@
,通过它可以很容易地解决您的问题。
replace.txt
应该是
s/?page=/\/page\//g
s/&//g
来自匿名者的很好的答案。\解决了我试图转义HTML字符串中的引号时的问题。
因此,如果您使用sed返回一些HTML模板(在服务器上),请使用双反斜杠而不是单反斜杠:
var htmlTemplate = "<div style=\\"color:green;\\"></div>";
在我正在开发的一个系统中,要由sed替换的字符串是来自用户的输入文本,它存储在一个变量中并传递给sed。
正如本文前面提到的,如果sed命令块中包含的字符串包含sed使用的实际分隔符,则sed会在出现语法错误时终止。考虑以下示例:
这是可行的:
$ VALUE=12345
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345
这打破了:
$ VALUE=12345/6
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
sed: -e expression #1, char 21: unknown option to `s'
在我的例子中,替换默认分隔符不是一个健壮的解决方案,因为我不想限制用户输入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
我已经将其转换为可供各种脚本使用的函数:
escapeForwardSlashes() {
# Validate parameters
if [ -z "$1" ]
echo -e "Error - no parameter specified!"
return 1
慷慨的丝瓜 · TabHost已经被弃用。 8 月前 |