我有一个csv文件,其中的数据为(具有:作为分隔符(。例如,
Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900
现在我需要打印第三个:
字符后有11或12的所有行。我写了自己的Regex,但当我把它写到sed
命令时,它不起作用吗?
$ sed -n -E 's#(?:.*?:){3}(11)s*/#p' datebook
sed: -e expression #1, char 25: unterminated `s' command
sed -n -E 's#(?:.*?:){3}(11)s*/#p'
此命令有几个问题:
s
命令用于替换,不要将其用于筛选- 当您需要另一个分隔符进行筛选时,必须转义第一个分隔符
- 而且你还是逃脱了
/
- 而且你还是逃脱了
sed
不支持非捕获组或非贪婪量词- 和非贪婪无论如何都不适合这里,因为只要至少有三个
:
字符,它就会尝试匹配-你需要一个否定的字符类来限制前三个:
字符
- 和非贪婪无论如何都不适合这里,因为只要至少有三个
- 你需要锚定搜索,否则它将匹配行中的任何位置,而不仅仅是从行的开头
以下是一个基于您对在第三次:
之后使用11
或12
获取行的描述的解决方案
sed -nE '/^([^:]*:){3}1[12]//p'
# with different delimiter
sed -nE '#^([^:]*:){3}1[12]/#p'
grep
使用起来更简单:
grep -E '^([^:]*:){3}1[12]/'
在我看来,awk
是最合适的,因为这是一种基于字段的处理:
awk -F: '$4 ~ /^1[12]//'
我在上述解决方案中没有使用s
,如果需要,您可以添加。