【问题标题】:HP-UX: regular expression repetition does not work?HP-UX:正则表达式重复不起作用?
【发布时间】:2014-09-16 21:26:59
【问题描述】:

我想提取那些第 4 个字段不为空的行。 但以下 RE 不起作用:

^\([^,]*,\)\{3\}[^,][^,]*,.*$

然后我尝试打印捕获的组,结果让我很困惑。 似乎重复不起作用。 请哪位大神解释一下。

详情(见第4~6行):

$ cat tmp
1AAA,BBB,CCC,DDD,EEE,FFF
2AAA,BBB,CCC,DDD,EEE,FFF
3AAA,BBB,,DDD,EEE,FFF
4AAA,BBB,CCC,,EEE,FFF
5AAA,BBB,CCC,,EEE,FFF
6AAA,BBB,CCC,,EEE,FFF
7AAA,BBB,CCC,DDD,EEE,FFF
8AAA,BBB,CCC,DDD,EEE,FFF
9xxxxxxx

$ sed -n "/^\(\([^,]*,\)\{3\}\)\([^,][^,]*\)\(,.*\)$/ {s//\1/;p;}" tmp
1AAA,BBB,CCC,
2AAA,BBB,CCC,
3AAA,BBB,,
4AAA,BBB,
5AAA,BBB,
6AAA,BBB,
7AAA,BBB,CCC,
8AAA,BBB,CCC,
$ uname
HP-UX

【问题讨论】:

  • 预期的输出是什么?
  • 我想知道为什么打印了 4~6 行。 {3} 应该得到 3 个文件...但这些行只有两个文件。
  • 我不知道你为什么使用复杂的命令来完成这个简单的任务。
  • 你能解释一下正则表达式吗?

标签: regex sed hp-ux


【解决方案1】:

awk 将打印第 4 个字段不为空的所有行。

awk -F, '$4' file
1AAA,BBB,CCC,DDD,EEE,FFF
2AAA,BBB,CCC,DDD,EEE,FFF
3AAA,BBB,,DDD,EEE,FFF
7AAA,BBB,CCC,DDD,EEE,FFF
8AAA,BBB,CCC,DDD,EEE,FFF

在这种情况下使用awk 可能更简单,因为它可以简单地测试字段。
这里只是测试$4是否不为空,并打印该行。

【讨论】:

  • 谢谢。但我想知道的是为什么正则表达式重复不起作用。
  • 我知道,但是使用正则表达式可能并不总是最简单的解决方案,而且这个awk 很容易理解并且应该适用于所有系统。 :)
【解决方案2】:

你可以试试下面的 GNU sed 命令,

$ sed -nr '/^[A-Z0-9]+,[A-Z]*,[A-Z]*,[A-Z]+,[A-Z]*,[A-Z]*$/p' file

$ sed -nr '/^.*,.*,.*,.+,.*,.*$/p' file
1AAA,BBB,CCC,DDD,EEE,FFF
2AAA,BBB,CCC,DDD,EEE,FFF
3AAA,BBB,,DDD,EEE,FFF
7AAA,BBB,CCC,DDD,EEE,FFF
8AAA,BBB,CCC,DDD,EEE,FFF

【讨论】:

  • 是的,GUN 版本运行良好。只是 HP-UX 是行不通的。
  • OP 没有说字段必须是字母数字字符,只是空的。所以它失败了字段4 = 3345
【解决方案3】:

当然,使用 awk 执行此操作要简单得多,正如 Jotne 提出的苗条且完美工作的答案所示。

如果您想调查您的 HP-UX sed 有什么问题,我建议您查看 this conversation 并尝试不通过文件而是通过 sed 的标准输入传递您的数据:cat tmp | sed -n ...sed -n ... < tmp.

不过,我第一次尝试解决您的问题,是用单引号替换您的双引号,因为您的双引号可能是您的 shell 试图解释 $/*,我不知道你用的是什么外壳...

【讨论】:

  • 谢谢。它是 sh 并且仍然无法正常工作。我注意到他们提到了 HPUX 版本。我的是11.11。可能这只是一个错误。另一个类似的问题:grep-regex-question
猜你喜欢
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多