このソースfile.cがあります。
#include <dir/header1>
#include <dir/header2>
#include <dir/header3>
...
私はdirの後のヘッダーだけを一致させたいのです(例header1
:)。私はこうする:
$ sed -En 's/\/(.*)>/\1/p' file.c
ただし、次のように出力されます。
#include <dirheader1
/
なので、行の先頭から一致しますが、文字別にグループ化したいです(したがってs/\/...
)。だから私は次のことを試しました。
$ sed -En 's/<.*\/(.*)>/\1/p' file.c
これらのどれも役に立ちません。それでは、それを達成する方法は何ですか?
答え1
headerx
コマンドを使用して表示された3行のビットのみを抽出するには、次の手順を実行する必要があります。s///
sed
削除する不要なラインのすべてのビット。
不要な行のビットは、先頭の#include <dir/
最初の文字列と>
最後の最後の文字列です。これはすべて正規表現と一致する必要があります。次に、キャプチャグループを使用して、初期文字列と最終文字列の間のビットを置き換えます。ワイヤーキャプチャされた文字列として:
sed -n 's,.*/\(.*\)>,\1,p' file.c
またはより具体的に言えば、
sed -n 's,^#include <dir/\(.*\)>,\1,p' file.c
答え2
試合の最初の部分をあきらめないので、コードを修正してそれを行うことができます。 @kusalananadaによると
または、否定的なパターンとして汎用マッチングを使用します。
sed -En "s|[^/]+/([^>]+)>|\1|p" file
特定の試合について#include
sed -En "s|^#include <dir/([^>]+)>|\1|p" file
またはgrep
あなたが
grep -Po "(?<=#include <dir/)[^>]+" file
またはgawk
awk -F"/|>" '$1~include{print $(NF-1)}' file