首页 > 解决方案 > 使用 sed 替换“../../../”

问题描述

我有一个文本文件需要编辑。第一个字段包含字符串

“../../../”

我想替换为

“/家”

. 我尝试使用 sed,但 .. 和 / 是特殊字符,我有点迷惑如何匹配这些模式。我尝试使用(..)之类的东西,但它似乎不适用于我的情况。谁能帮我理解如何匹配这种模式?

标签: regexsedspecial-characters

解决方案


.字符被 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/

推荐阅读