首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在sed中替换东西的顺序很重要?

为什么在sed中替换东西的顺序很重要?
EN

Stack Overflow用户
提问于 2016-05-21 02:28:40
回答 3查看 650关注 0票数 0

我有一个这样的文件:

代码语言:javascript
复制
(paren)
[sharp]

我试着像这样替换:

代码语言:javascript
复制
sed "s/(/[/g" some_file.txt 

它工作得很好:

代码语言:javascript
复制
[paren)
[sharp]

然后我试着像这样替换:

代码语言:javascript
复制
sed "s/[/(/g" some_file.txt 

它给了我一个错误:

代码语言:javascript
复制
sed: 1: "s/[/(/g": unbalanced brackets ([])

我找不到任何证据来解释为什么这会出错。为什么[(的顺序很重要?

非常感谢。

EN

回答 3

Stack Overflow用户

发布于 2016-05-21 02:31:48

[是的一部分,它必须有一个结束的副本(])。

转义[以匹配文字[符号:

代码语言:javascript
复制
echo "[sharp]" | sed 's/\[/(/g'

请参阅IDEONE demo

票数 4
EN

Stack Overflow用户

发布于 2016-05-21 02:34:53

它之所以重要,是因为您将用文字字符串替换正则表达式。因此,当在第二个斜杠之后使用时,括号被视为一个字符。当在第一个和第二个斜杠之间使用时,它被视为无效正则表达式的一部分。

因此,在此表达式中,'[‘被视为一个字符:

s/(/[/g

在此表达式中,它不是:

s/[/(/g

票数 2
EN

Stack Overflow用户

发布于 2016-05-21 03:20:14

使用sed替换的第一个参数必须是正则表达式模式:

s/regex_pattern/replacement_string/

左方括号在正则表达式模式中有特殊的含义,因为它是字符类的开始,例如[a-z]。这就是为什么您会得到这个与替换顺序无关的错误消息:unbalanced brackets ([]) (打开的字符类必须关闭。)

要获得文字左方括号,需要对其进行转义:\[

代码语言:javascript
复制
sed 's/\[/(/' file

如果您的目标是将字符转换为其他字符,则有一种更简单的方法,即使用转换,它可以避免循环替换的问题:

代码语言:javascript
复制
a='(paren)
[sharp]'

使用tr

代码语言:javascript
复制
echo "$a" | tr '[]()' '()[]'

或使用sed

代码语言:javascript
复制
echo "$a" | sed 'y/[]()/()[]/'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37353513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档