在 SED 中使用 REGEX 进行模式匹配会导致未终止的"s"命令



我有一个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不支持非捕获组或非贪婪量词
    • 和非贪婪无论如何都不适合这里,因为只要至少有三个:字符,它就会尝试匹配-你需要一个否定的字符类来限制前三个:字符
  • 你需要锚定搜索,否则它将匹配行中的任何位置,而不仅仅是从行的开头

以下是一个基于您对在第三次:之后使用1112获取行的描述的解决方案

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,如果需要,您可以添加。

最新更新