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

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

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

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

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

答え2

サンプルコンテンツを次に追加しました。ディスクファイル名前付き文書その後、コンテンツを表示します。文書使用cat 注文する。その後、awkオンを使用してデフォルトでfile呼び出す部分を削除しました。商標そして2枚を印刷してみてくださいデータタブ区切り滞在。これがあなたが探しているものですか?

$ cat file
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 '{sub(/\<\<\//, "")};{sub(/\/Type.*\/Contents\(/, "\t")};{sub(/\)\/F.*$/, "")};/Page [0-9]/{print}' file
Page 250    EXAMPLE OF TEXT TO BE EXTRACTED
$

何ですかawk プログラムしている:

  • /Page [0-9]/スペース(例:「ページ」)と数字(例:)を含む行を検索しますPage 250EXAMPLE OF TEXT TO BE EXTRACTEDパターンが含まれていないとします。それでも構わないと思います。パスワードこれに対応するように簡単に変更できます。

  • sub(/\<\<\//, "")巻線:<</

  • sub(/\/Type.*\/Contents\(/, "\t")/Type間のすべてをタブに置き換えます。/Contents(
  • sub(/\)\/F.*$/, ""))/Fその行から最後まですべてを削除します。

今残っているのは印刷されるだけです。手配アイテム2個データタブ文字で区切ります。

私はこれがあなたが言及したすべてをカバーしていないことを知っていますが、他の要件は十分には明確ではありません。 1つのファイルのみを処理する必要がありますか、または複数のファイルを処理する必要がありますか?どちらの場合も、抽出されたすべてのデータを1つのファイルに入れたいですか?そして、照合方法などを選択してください。

だから、いくつかのことを明確にすることができれば、私は1つを書くでしょうバッシュスクリプト隠す。

明らかにawk プログラム出力を次にリダイレクトできるようにしました。結果ファイルそして努力し続けるsort 注文する。並べ替えも可能ですが、この時点では1つawkのコマンドラインからターゲットデータを取得できます。awk

関連情報