请求解析含特殊字符的Sed命令含义及正则匹配问题
Sed命令解析与问题解答
一、完整命令的实际含义
原命令是经过HTML转义的,实际执行的shell命令为:
sed 's/"[0\.Na]\+ EUR"//g' file.txt | sed '/^"[^"]*",\+$/d'
这是两个sed命令通过管道串联,对file.txt进行文本处理,具体功能如下:
1. 第一个sed命令:删除指定格式的字符串
sed 's/"[0\.Na]\+ EUR"//g' file.txt
这是全局替换删除操作:
- 匹配模式:
"[0\.Na]\+ EUR"":匹配双引号字符[0\.Na]:匹配单个字符,可选值为0、.、N、a(字符集内的.无需转义,这里的\.是shell转义后留给sed的写法,作用是明确匹配.字符)\+:在sed基础正则中,表示匹配前面的字符(即[0\.Na]中的任意一个)一次或多次EUR":匹配空格、EUR字符串和结尾的双引号
- 作用:删除每行中所有符合
"X EUR"格式的字符串(X由一个或多个0、.、N、a组成),比如"0 EUR"、"Na.Na EUR"这类内容都会被删除。
2. 第二个sed命令:删除指定格式的整行
sed '/^"[^"]*",\+$/d'
这是匹配行删除操作:
- 匹配模式:
^"[^"]*",\+$^:匹配行首":匹配开头的双引号[^"]*:匹配任意数量(包括0)的非双引号字符":匹配内容末尾的双引号,\+:匹配一个或多个逗号$:匹配行尾
- 作用:删除整行内容为
"XXX",,,或"XXX",这类格式的行(即行内容是双引号包裹的任意内容,后面跟一个或多个逗号,无其他内容)。
二、regex101测试失败的原因
你测试的\"[0\\.Na]\\+ EUR\"是错误的写法,问题出在:
\"是HTML转义字符,用来在网页中表示",但regex101中直接写"即可匹配双引号,不需要该转义[0\\.Na]中的\\是shell层面的转义,实际sed接收的是[0\.Na],而在regex101中,字符集里的.无需转义,直接写[0.Na]即可;若选择POSIX基础正则引擎,才需要写成[0\.Na]\\+同样是shell转义后的写法,sed基础正则中用\+表示一次或多次,但regex101默认使用PCRE正则,直接写+即可实现相同效果
正确的测试正则(PCRE引擎)应为:"[0.Na]+ EUR";若使用POSIX基础正则引擎,则为:"[0\.Na]\+ EUR"。
内容的提问来源于stack exchange,提问作者Roberta Barone
相关产品推荐
相关产品推荐

