gpt4 book ai didi

regex - 何时转义 shell 中的特殊字符

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:50 24 4
gpt4 key购买 nike

伙计们:
我很难判断什么时候转义 shell 中的特殊字符,以及应该转义哪个字符。例如:

sed '/[0-9]\{3\}/d' filename.txt  

像上面一样,为什么我们要转义 { 而保持 [ 不变,我认为它们都是特殊字符。
你能帮我吗?

/br

最佳答案

一般的回答是,当你想把它们当作文字字符时,你需要转义具有特殊含义的字符,而不是因为它们的特殊含义。哪些字符具有特殊含义的规则因程序而异。


您的具体问题涉及对 sed 具有特殊含义的字符;单引号防止任何包含的字符被 bash 解释。

在这种情况下,您要转义 {} 以防止 sed 解释它们。首先,考虑这个命令:

sed '/[0-9]{3}/d' filename.txt

如果您使用的 sed 版本对 [{ 进行特殊处理,则此命令会删除包含恰好 3 位数字的序列。 [0-9] 不是文字的 5 个字符的字符串;它是一个匹配任何单个数字的正则表达式。 {3} 不是文字的 3 个字符的字符串;它是一个修饰符,正好匹配前面的正则表达式中的 3 个。将匹配如下行:

593
3296

但不是

34a7

因为没有连续的 3 位数字。

现在,考虑你的命令:

sed '/[0-9]\{3\}/d' filename.txt

[0-9] 仍然是匹配单个数字的正则表达式。但是现在,你已经摆脱了牙套。 sed 不是前面正则表达式的修饰符,而是将其视为文字字符 {3}。所以它将匹配如下行:

0{3}
1{3}
5{3}

但不是这样的行

346

因为没有大括号。

关于regex - 何时转义 shell 中的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22057960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com