regex - 使用 sed 替换“../../../”
问题描述
我有一个文本文件需要编辑。第一个字段包含字符串
“../../../”
我想替换为
“/家”
. 我尝试使用 sed,但 .. 和 / 是特殊字符,我有点迷惑如何匹配这些模式。我尝试使用(..)之类的东西,但它似乎不适用于我的情况。谁能帮我理解如何匹配这种模式?
解决方案
该.
字符被 sed 视为通配符,因此需要对其进行转义。如果您将其用作分隔符,您还需要转义该/
字符:
sed 's/\.\.\/\.\.\/\.\.\//\/home/g'
# ^ ^ ^ <-- locations of '/' delimiters
# ^^ ^^ ^^ ^^ <-- locations of '\/' to match literal '/' characters
您提供给 sed 的第一个字符用作分隔符。如果您的正则表达式看起来像/.../.../
或s/.../.../
然后分隔符变为/
. 如果您将该/
分隔符替换为其他内容,则无需转义您正在搜索(或替换为)的文字“/”字符:
# Same as above, but with delimiters swapped from '/' to '@':
sed 's@\.\.\/\.\.\/\.\.\/@\/home@g'
# ^ ^ ^ <-- locations of '@' delimiters
# ^^ ^^ ^^ ^^ <-- locations of '\/' to match literal '/' characters
现在使用@
used 作为分隔符而不是/
,您可以使用更少的转义/
字符简化/重写它:
sed 's@\.\./\.\./\.\./@/home@g'
# ^ ^ ^ <-- locations of '@' delimiters
# ^ ^ ^ ^ <-- locations of literal '/' characters
笔记:
可悲的是,\.
它不是很可读,但很有必要,所以你没有这种边缘情况:
$ echo 'ab/../cd/' | sed 's@../../../@/home@g'
/home
以上内容应保持不变:
$ echo 'ab/../cd/' | sed 's@\.\./\.\./\.\./@/home@g'
ab/../cd/
推荐阅读
- apache-spark - 无法设置 kafka spark 消费者配置
- xcode - 表达式类型不明确,没有更多上下文问题
- c# - ASP.NET MVC - 在发布方法后插入数据库
- vdm++ - 如何将谓词应用于集合?
- amazon-web-services - Terraform 采用 Amazon Linux 1
- sap-cloud-sdk - VDM 的更新未更新 S/4 上的数据
- c++ - C++:用户定义的显式类型转换函数错误
- ios - Ionic 4 - InAppBrowser 插件在 ios 上导致错误:exc_bad_instruction (code=exc_i386_invop subcode=0x0)
- flutter - 如何在颤动的多个视图中共享相同的值?
- python - 如何正确处理外部文本文件