パターンに基づいて文字を抽出しますが、2つの範囲の開始パターンと共通の終了パターンの間でのみ文字を抽出します。

パターンに基づいて文字を抽出しますが、2つの範囲の開始パターンと共通の終了パターンの間でのみ文字を抽出します。

作業するデータ(some-mutool-clean-pdf-file)は次のとおりです。前の数字はデータの一部ではありませんが、私の質問を明確にするのに役立つことを願っています。

1 blabla
2 /Span <</MCID
3 .(s).(o)..(m).(e)...(c).(h)..(a)...(r)..
4 .(s).(o)..(m).(e)...(c).(h)...(a)..(r)..
5 .(s).(o)..(m).(e)...(c).(h)..(a)...(r)..
6 EMC
7 blabla
8 blabla
9 blabla
10 /H1 <</MCID
11 .(s).(o)..(m).(e)...(c).(h)..(a)...(r)..
12 .(s).(o)..(m).(e)...(c).(h)...(a)..(r)..
13 .(s).(o)..(m).(e)...(c).(h)..(a)...(r)..
14 EMC
15 blabla

ドットは\d「または」または[]または」TJなどを表しているため、印刷しないことをお勧めします。

望ましい結果:

3 somechar
4 somechar
5 somechar
11 somechar
12 somechar
13 somechar

次のコマンドは、「マルチブートモード」がないことを除いて、私が達成したいことを大まかに実行します。より良い/他の方法があると確信していますが、これが一緒に編集できる方法です。

sed -n '/\/H1\ <<\/MCID/,/EMC/{=;p}' somepdffile |  sed '{N;s/\n/ /}' | sed -n 's/\[\(.*\)\]/...\1.../p' | sed 's/(\|)\|\.\|TJ\|-//g' | sed -r
> 's/(^[0-9]*)*[0-9]*/\1/g'

これがうまくいくと想像する方法は次のとおりです。残念ながらそうではありませんが、私が何を達成したいのかを示すことを願っています(「マルチスタートパターン」と「終了マッチング」 - 名前が正しく指定されていることを願っています)。

ここで、「マルチスタートパターン」とは、明示的に次のことを意味する。/H1 <<MCIDまたは/Span <<MCID、両方で終わりますEMC。 :と一致する方法はありませんが、またはとは異なるタグが/any_tag <<MCIDあります。括弧の間の文字は常にパターンがあるすべての範囲で印刷する必要がありますが、他のタグで始まる範囲でも印刷してはいけません。H1Span(letter)

sed -n '/\/H1\ <<\/MCID\|\/Span\ <<\/MCID/,/EMC/{=;p}' somepdffile |  sed '{N;s/\n/ /}' | sed -n 's/\[\(.*\)\]/...\1.../p' | sed 's/(\|)\|\.\|TJ\|-//g' | sed -r 's/(^[0-9]*)*[0-9]*/\1/g'

どんな助けでも大変感謝します。よろしくお願いします!

ベストアンサー1

ここに解決策がありますawk。この機能を実装するにはGNU awkが必要ですgensub()

awk '$0=="EMC" {s=0} s{print FNR, gensub(/[^(]*\((.)\)[^(]*/, "\\1", "g")} /^\/(Span|H1) <<\/MCID$/ {s=1}' test.pdf

s/Spanこれは、ORで始まり、/H1次にORで終わる行で定義された開始パターンが見つかった場合、フラグを1に設定します<</MCIDEMC以下を含む行が見つかると、このフラグはリセットされます。

この範囲(つまり、s1の場合)内でこの関数を使用して、「a以外の文字の数に関係なく、その後にa以外の文字が続きます」パターンをgensub()次に含まれる文字に置き換えます。 。次に、現在の行番号と抽出されたテキストを印刷します。(( )(( )

ノートこれは、以下があることを意味します。いいえ開始線と終了線の間にはこのパターンの線はありません。

おすすめ記事