特定の行を抽出する必要がありますが、少し異なる構造を持つプレーンテキストファイルがたくさんあります。
このテキスト行は特定のパターンに従わず(つまり、内容が常に異なる)、ファイル内の同じ場所に常に配置されるわけではありません。通常、ファイルの先頭の近くにあります。
ファイルはプレスリリース(もともとPDFに、即座にテキストに変換を使用pdftotext
)、抽出する必要がある行は後でファイル名として使用する必要があるトピックです。
このファイルを実行してsed -n '1p'
最初の行を抽出すると、時には目的の結果が得られますが、そうでない場合が多いことがあります。
私が得たさまざまな結果の例:
Title of the press release # correct result
# wrong, here the first line is empty
29.9.2016 # wrong, here the first line contains the date
PRESS RELEASE # also wrong, I would need to scan further down
ほぼすべてのケースです。私を希望するのは、ファイルの構造が非常に似ていて、先頭にヘッダーが含まれているため、スキャンを続けるとすぐに必要なものを見つけることができるということです。
sedに知らせる方法はありますか?同じsedコマンドで、一連の条件が満たされるまで、さまざまなパターンを試してください。いいえ会いましたか?
私の場合は、sedに次のように言うべきです。
- 行が空であることを確認
- 行に日付が含まれていないことを確認してください。
- 行に「プレスリリース」という単語が含まれていないことを確認してください。
条件のどれも満たされない場合、対応するラインが出力される。満たされると、次の行にジャンプします。
これがsedができることですか?
答え1
PRESS RELEASE
空ではなく(空白のみを含まず)、数字と点だけを含まず、文字列(大文字)も含まないすべての形式のテキストで最初の行を見つけます。
sed '/^[[:blank:]]*$/d; /^[0-9.]*$/d; /PRESS RELEASE/d; q' file
日付-
にスペースを含めることができ、ifが、または(または他の組み合わせ)PRESS RELEASE
で書くことができる場合:press release
Press Release
Press release
pRESS Release
sed -E '/^[[:blank:]]*$/d; /^[0-9. -]*$/d; /[Pp](RESS|ress) [Rr](ELEASE|elease)/d; q' file
または、sed
大文字と小文字を区別しない一致にはGNUを使用してくださいpress release
。
sed '/^[[:blank:]]*$/d; /^[0-9. -]*$/d; /press release/Id; q' file
パターンがトリガーされるたびに、d
コマンドは入力からその行を削除し、次の行に新しいループを開始します。モードがトリガーされない場合、q
スクリプトは終了しますが、現在の行が最初に印刷されます。