bsd sed和双引号

时间:2012-05-29 07:40:27

标签: sed bsd

考虑文件test.txt

#include "foo.h"
#include "bar.h"
#include "baz.h"

使用GNU sed版本4.2.1(在Ubuntu 10.04.4 LTS上),我可以用以下内容提取foo.h,bar.h和baz.h:

SHELL$) sed -n -e 's:^\s*\#include\s*"\(.*\)".*:\1:p' test.txt
foo.h
bar.h
baz.h

使用BSD sed(在Mac OS X上),并修改上面的命令,我可以提取foo.h,bar.h和baz.h,但是用双引号:

SHELL) sed -n -e 's:^\s*\#include\s*\(.*\).*:\1:p' test.txt
 "foo.h"
 "bar.h"
 "bar.h"

如何使用BSD sed提取没有引号的名称?这些命令的输出为空:

SHELL) sed -n -e 's:^\s*\#include\s*"\(.*\)".*:\1:p' test.txt
SHELL) sed -n -e 's:^\s*\#include\s*\"\(.*\)\".*:\1:p' test.txt

1 个答案:

答案 0 :(得分:2)

BSD sed(不出所料,真的)不支持\s Perlism - 它被解释为文字s。试试这个;

 sed -n -e 's!^[[:space:]]*\#include[[:space:]]*"\(.*\)".*!\1!p' test.txt

字符类[[:space:]]应该适用于所有POSIX正则表达式实现。 (在对括号进行分组之前,其他sed可能需要也可能不需要反斜杠。)