タグ間で文字列を抽出して新しいテキストファイルに保存する

タグ間で文字列を抽出して新しいテキストファイルに保存する

ファイルからテキスト文字列を抽出して新しいファイルに入れる必要があります。各文字列は常に同じテキスト(ラベル)の間にあります。

以下は例です(このような数百のブロックがあり、そのブロックのデータをファイルに保存する必要があります)。

1731 0 obj
<</Page 250/Type/Annot/Subtype/Highlight/Rotate 0/Rect[ 95.4715 347.644 337.068 362.041]/NM(929cd95c-f962-4fa3-b734-2e0e67d7b321)/T(iPad)/CreationDate(D:20160818145053Z00'00')/M(D:20160818145204Z00'00')/C[ 0.454902 0.501961 0.988235]/CA 1/QuadPoints[ 95.4715 362.041 337.068 362.041 95.4715 347.644 337.068 347.644]/Contents(EXAMPLE OF TEXT TO BE EXTRACTED)/F 4/Subj(Highlight)>>
endobj

抽出する必要があります250ページそして抽出するテキストの例

~のため250ページたとえば、関連タグは次のとおりです。

<</

そして

/Type

~のため抽出するテキストの例たとえば、関連タグは次のとおりです。

/Contents(

そして

)/F

最終的にページとそのテキストを昇順に並べ替えたいのですが、スプレッドシートで管理できます。

答えのいくつかを試してみました。ここしかし、うまくいきませんでした...

私はUnixのコマンドラインに最も慣れていますが、PythonとAppleScriptについては少し知っています。

ベストアンサー1

そしてawk

awk -F/ '$1=="<<" {i=$2; for(j=3;j<=NF;j++) \
         if($j~/^Contents/) split($j,a,"[()]"); print i " _ " a[2]}' file.txt
  • フィールド区切り記号をに設定し、/最初のフィールドがある場合は後で印刷できる<<ように2番目のフィールドを変数として保存します。i

  • 残りのフィールドを繰り返し、フィールドがで始まる場合は、Contentsフィールドを分割して()配列を作成しますafor(j=3;j<=NF;j++) if($j~/^Contents/) split($j,a,"[()]")

  • 変数iと配列の2番目の要素をa分離して印刷します。_

例:

% cat file.txt                                                                                                        
1731 0 obj
<</Page 250/Type/Annot/Subtype/Highlight/Rotate 0/Rect[ 95.4715 347.644 337.068 362.041]/NM(929cd95c-f962-4fa3-b734-2e0e67d7b321)/T(iPad)/CreationDate(D:20160818145053Z00'00')/M(D:20160818145204Z00'00')/C[ 0.454902 0.501961 0.988235]/CA 1/QuadPoints[ 95.4715 362.041 337.068 362.041 95.4715 347.644 337.068 347.644]/Contents(EXAMPLE OF TEXT TO BE EXTRACTED)/F 4/Subj(Highlight)>>
endobj

% awk -F/ '$1=="<<" {i=$2; for(j=3;j<=NF;j++) if($j~/^Contents/) split($j,a,"[()]"); print i " _ " a[2]}' file.txt
Page 250 _ EXAMPLE OF TEXT TO BE EXTRACTED

おすすめ記事