HP-UX:正则表达式重复不起作用?

时间:2014-07-25 05:35:09

标签: regex sed hp-ux

我想要获取那些第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

3 个答案:

答案 0 :(得分:0)

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是否为空,并打印该行。

答案 1 :(得分:0)

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

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

OR

$ 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

答案 2 :(得分:0)

当然,使用awk这样做更简单,正如Jotne提出的简洁而完美的工作答案所示。

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

我首次尝试对您的问题进行排查,但是用单引号替换双引号,可能是您的shell试图解释sed -n ... < tmp$/的双引号,I不知道你正在使用什么外壳......