作業するデータ(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
あります。括弧の間の文字は常にパターンがあるすべての範囲で印刷する必要がありますが、他のタグで始まる範囲でも印刷してはいけません。H1
Span
(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に設定します<</MCID
。EMC
以下を含む行が見つかると、このフラグはリセットされます。
この範囲(つまり、s
1の場合)内でこの関数を使用して、「a以外の文字の数に関係なく、その後にa以外の文字が続きます」パターンをgensub()
次に含まれる文字に置き換えます。 。次に、現在の行番号と抽出されたテキストを印刷します。(
( )
(
( )
ノートこれは、以下があることを意味します。いいえ開始線と終了線の間にはこのパターンの線はありません。