在 sed 命令和范围地址中使用不同的分隔符

问题描述 投票:0回答:3

我在 shell 脚本中使用 sed 来编辑文件系统路径名。假设我想更换

/foo/bar

/baz/qux

但是,sed 的

s///
命令使用正斜杠
/
作为分隔符。如果我这样做,我会看到一条错误消息,例如:

▶ sed 's//foo/bar//baz/qux//' FILE
sed: 1: "s//foo/bar//baz/qux//": bad flag in substitute command: 'b'

同样,有时我想选择线条范围,例如图案

foo/bar
baz/qux
之间的线条。再说一次,我不能这样做:

▶ sed '/foo/bar/,/baz/qux/d' FILE
sed: 1: "/foo/bar/,/baz/qux/d": undefined label 'ar/,/baz/qux/d'

我能做什么?

sed
3个回答
105
投票

您可以通过反斜杠使用替代正则表达式分隔符作为搜索模式:

sed '\,some/path,d'

只需按原样使用

s
命令即可:

sed 's,some/path,other/path,'

不过,您可能想保护其他元字符;这是使用 Perl 和

quotemeta
或其他脚本语言中的等效项的好地方。

来自

man sed

/regexp/

匹配与正则表达式匹配的行
regexp
.

\cregexpc

匹配与正则表达式
regexp
匹配的行。
c
可以是除反斜杠或换行符之外的任何字符。

s/regular expression/replacement/flags

将替换字符串替换为模式空间中正则表达式的第一个实例。可以使用反斜杠或换行符以外的任何字符代替斜杠来分隔 RE 和替换。在 RE 和替换中,如果 RE 分隔符前面有反斜杠,则它本身可以用作文字字符。


46
投票

也许最接近标准的是 POSIX/IEEE 开放组基本规范

[2addr] s/BRE/替换/标志

将替换字符串替换为 BRE 实例 图案空间。 除反斜杠或换行符之外的任何字符都可以 使用而不是斜杠来分隔 BRE 和替换。 在 BRE 和替换中,BRE 分隔符本身可以是 如果前面有反斜杠,则用作文字字符。”


-2
投票

当原字符串或替换字符串中存在斜杠

/
时,我们需要使用
\
进行转义。

sed 's/\/foo\/bar/\/baz\/qux/' file

在 Ubuntu 16.04 (

sed
4.2.2) 上测试。

© www.soinside.com 2019 - 2024. All rights reserved.