regex - 转义文字点如何为 sed 工作
问题描述
以下sed
命令
echo '.' | sed "s/\\./foo/"
正如预期的那样,替换.
为。但是,如果我们在上述命令中foo
转义非字母数字.
echo '.' | sed "s/\\\./foo/"
几乎不打印.
,而foo
预期。sed
应该从字面上匹配字符.
,但事实并非如此。我无法理解点发生了什么。我相信如果字符串被双引号括起来,我应该在 bash 中的每个非字母数字字符前面简单地放一个反斜杠。点是非字母数字字符,那么转义它有什么问题,为什么会产生不同的结果?
解决方案
这是因为反斜杠如何在 bash 双引号"
转义中起作用。
echo "\\"
\
echo "\."
\.
echo "s/\\./foo/"
s/\./foo/
echo "s/\\\./foo/"
s/\\./foo/
来自man bash
:
Within double quotes, the backslash retains its special meaning only when
followed by one of the following characters: $, `, ", \,or <newline>.
所以在第一种情况下,sed 获取s/\./foo/
并将其解释为“用 foo 替换点”。在第二种情况下,sed 获取s/\\./foo/
并将其解释为“用 foo 替换反斜杠和另一个字符。
在这种情况下,您最好使用单引号转义:
echo 's/./foo/'
s/./foo/
echo 's/\./foo/'
s/\./foo/
这可能是你想要的。
推荐阅读
- python - Python:如果小于,如何用另一个数组的值替换数组中的值?
- sql - 插入表的视图是否会影响新数据的上传(到表中)
- eclipse - BundleException:缺少约束:导入包:org.eclipse.e4.ui.internal.workbench.swt;版本="0.0.0"
- javascript - CSS底部填充页面停止滚动?
- java - 使用 Java 和 Selenium 从 HTML 中解析信息以找出选定的选项
- c++ - 致命错误 C1001:编译器发生内部错误 - openmp for parallel for
- python - Is there a pythonic way to decouple optional functionality from a function's main purpose?
- php - 如何执行 rolling_curl 函数
- image-processing - GIMP 使用什么前景选择算法?
- xamarin - Xamarin Forms ListView.Footer Margin 未在 iOS 上应用