[英]Using special character ? in sed
我正在尝试使用sed替换以下格式的电话号码:
+1(123)456-7890
其中+
和以下1
是可选的。 其他数字是任意的,但格式必须相同(即+1(123)456-7890、1(321)456-0987,(222)555-9900应该匹配)
我在这个问题中读到,我要么需要使用扩展的正则表达式选项,要么转义所有出现的{
}
和?
如果我想将它们用作特殊字符。 由于--regexp-extended
在我的sed版本中不可用,因此我选择转义特殊字符。
这是我到目前为止尝试过的:
sed 's/+\\?1\\?([0-9]\\{3\\})[0-9]\\{3\\}-[0-9]\\{4\\}/test/g'
与我指定的格式编号不匹配。
我能得到的最接近的是:
sed 's/([0-9]\\{3\\})[0-9]\\{3\\}-[0-9]\\{4\\}/test/g'
这可以匹配(222)555-9900等,但显然不匹配开头为+1
或+
或1
数字。
我有点迷茫,因为我尝试了很多不同的方法来匹配上一个表达式的0或1,但是它们都不起作用。
以防万一它可能会有所帮助:我使用的是Macbook上预先安装的sed。
您可以申请*
或\\?
分组。 例如: \\(abc\\)\\?
表示“文本'abc'可以存在或不存在”。
对于您的情况,解决方案是:
sed 's/\(+\?1\)\?([0-9]\{3\})[0-9]\{3\}-[0-9]\{4\}/test/'
要么
sed -E 's/(\+?1)?\([0-9]{3}\)[0-9]{3}-[0-9]{4}/test/'
顺便说一句,在Macbook中,您已安装了BSD。 在Linux中,通常使用GNU sed(它也支持'-E'标志作为'-r'的别名)。 因此最好始终使用“ -E”来实现可移植性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.