考虑文件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
答案 0 :(得分:2)
BSD sed
(不出所料,真的)不支持\s
Perlism - 它被解释为文字s
。试试这个;
sed -n -e 's!^[[:space:]]*\#include[[:space:]]*"\(.*\)".*!\1!p' test.txt
字符类[[:space:]]
应该适用于所有POSIX正则表达式实现。 (在对括号进行分组之前,其他sed
可能需要也可能不需要反斜杠。)