2012-05-29 83 views
0

考虑文件test.txt:使用GNU sed的版本4.2.1(在Ubuntu 10.04.4 LTS)BSD sed和双引号

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

,我可以提取了foo.h,bar.h和baz.h用:使用BSD

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

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

对于便携式解决方法,只是将你的sed命令之前从输入删除双引号('TR““”''')。 – mouviciel

回答

2

BSD sed(勿庸置疑,真的)不支持\s Perlism - 它被解释为只是一个文字s。试试这个;

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

字符类[[:space:]]应该在所有POSIX正则表达式实现中工作。 (其他sed S可以或者可能不希望分组括号之前的反斜杠。)