我有一堆文本文件(名为install*
),其中我需要将表达式curl -L
替换为表达式curl -k -L
。我在OS X 10,Yosemite。
以下尝试不起作用:
sed -e "s/'curl -L'/'curl -k -L'/g" install*
sed -i '' -e "s/'curl -L'/'curl -k -L'/g" install*
显示文件的内容(就好像我输入了cat
),但未执行替换。
我做错了什么?
答案 0 :(得分:1)
您需要-i
。
GNU sed使用不带参数的-i
来表示“替换就地”。
BSD sed需要一个空参数,因此您必须使用sed -i '' -e '...' install*
使用sed没有可移植的方法...
答案 1 :(得分:1)
您的问题是,当您不应时,您正在嵌套引用机制(分隔符)。
通常,您应该使用单个引号将sed
脚本整合在一起 :
sed -i '' -e 's/curl -L/curl -k -L/g' install*
通过使用单个引号,可以保护脚本免受 shell 的意外解释。
如果您确实希望shell预先解释sed
脚本的部分内容,将中的这些部分拼接为 double - 引用字符串。
要sed
的{{1}}功能,s
充当分隔符 - {{> 引用{{}之间的字符串应该使用1}}实例,并且使用/
只会导致/
将这些单引号正则表达式的一部分视为匹配/替换字符串。 (顺便说一句:您可以自由选择'
以外的分隔符。
也就是说,如果您确实需要强制将某些字符解释为文字,使用sed
- 转义,例如使用/
在正则表达式中表示文字 \
这是 \.
本身支持的唯一引用机制。
但是,在您的特定情况下,正则表达式中使用的字符串和用作替换字符串的字符串都不需要转义。
对于通用方法来转义字符串以在这些情况下用作文字,请参阅 https://stackoverflow.com/a/29613573/45375