0

ファイルを検討してください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 lion 上) を使用し、上記のコマンドを変更すると、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
4

1 に答える 1

2

BSD sed(当然のことながら、本当に) は Perlism をサポートしていません\s。Perlism は単なるリテラルとして解釈されsます。代わりにこれを試してください。

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

文字クラス[[:space:]]は、すべての POSIX 正規表現の実装で機能するはずです。(他sedの s では、括弧をグループ化する前にバックスラッシュが必要な場合と不要な場合があります。)

于 2012-05-29T11:37:31.617 に答える