改行を使用して文字列の最初の行を取得する

改行を使用して文字列の最初の行を取得する

私は改善しようとしています。引用符を抽出するbashスクリプトiBooks(Appleの本を読むソフトウェア)からコンテンツをコピーしたときに生成される文字列。

ファイルの最初の行を抽出してこれを行うことができることを知っていますが、ファイルを表示するのではなく、複数行の改行を持つhead -1 filename文字列を見ることです。

クリップボードの例は次のとおりです。

“When there is no data to guide intuition, scientists impose a “compatibility” criterion: any new theory attempting to extrapolate beyond tested ground should, in the proper limit, reproduce current knowledge.”

Excerpt From
The Island of Knowledge
Marcelo Gleiser
This material may be protected by copyright.

以前に有効なbashスクリプト(このセクションで説明されているように)スタック交換の回答)例:

sed -E -e 's/^[ ]?[0-9]* //g' | sed -E -e 's/“[ ]?[0-9]?[ ]?//g' | sed -E -e 's/”$//g'  | sed -E -e 's/^(Excerpt From).*//g'

今、最後の3行だけが残っています。

ベストアンサー1

sedパイプラインで複数回実行する必要はありません。sed複数の-eオプションを選択でき、各オプションには宣言があります。 1つのオプションのみを使用し-e、ステートメントをセミコロンで区切ることもできます;。または、それぞれが複数の別々のステートメントを持つ複数の-eオプションが;あります。

sedコマンドは次のように書くのが最善です。

sed -E -e 's/^[ ]?[0-9]* //g; s/^“[ ]?[0-9]?[ ]?//g; s/”$//g; s/^(Excerpt From).*//g'

2番目のステートメントでは、3番目のステートメントが行^の終わりに固定を使用する方法と同様に、正規表現パターンを行の先頭に「固定」しました$

しかし、sedは複数行の文字列をうまく処理できません。

しかし、Perlは-pオプションを使用してsedを置き換えることができます(少なくともsedこのような単純なスクリプトの場合 - より複雑なsedスクリプトは完全にperlスクリプトで書き直すのが最善です)。

$ cat /tmp/book.txt 
“When there is no data to guide intuition, scientists impose a “compatibility” criterion: any new theory attempting to extrapolate beyond tested ground should, in the proper limit, reproduce current knowledge.”

Excerpt From
The Island of Knowledge
Marcelo Gleiser
This material may be protected by copyright.

$ perl -0777 -p -e 's/^[ ]?[0-9]* //msg;
                    s/^“[ ]?[0-9]?[ ]?//msg;
                    s/”$//msg;
                    s/^(Excerpt From).*//msg;
                    s/^\s*$//msg' /tmp/book.txt 
When there is no data to guide intuition, scientists impose a “compatibility” criterion: any new theory attempting to extrapolate beyond tested ground should, in the proper limit, reproduce current knowledge.
  • セミコロンの後のスペース(sedの例では)と改行文字(perlの例では)はオプションです。これは読みやすくするためだけのもので、sedスクリプトとPerlスクリプトの実行方法には影響しません。

  • s/^\s*$//msg空行を削除する別のステートメントが追加されます。

  • 残りの「スマート」引用符を通常の二重引用符文字に変換するには、s/“|”/"/g;このステートメントs/^\s*$//msgの前に別のステートメントを追加します。その後、出力は次のようになります。

    When there is no data to guide intuition, scientists impose a "compatibility" criterion: any new theory attempting to extrapolate beyond tested ground should, in the proper limit, reproduce current knowledge.
    
  • これらのs///ステートメントはおそらく最適化することができますが、テストするサンプルがもう存在しないため、他の入力に対して機能しない場合に備えて試すことは消えます。

  • -0777Perlにファイル全体を1つの長い文字列で一度に読み取るように指示します。

  • -pPerlに入力を繰り返し、スクリプトの-e文を実行し、スクリプトが変更した後に入力を印刷するように指示します。言い換えれば、sed動作方法に非常に似ています。

  • 同様に、sedこの-eオプションは、次の引数がスクリプトであることを示します。

  • m正規表現修飾子は、sPerl正規表現が複数行文字列を処理する方法を変更します。からman perlre

"m" 一致する文字列を複数行として扱います。つまり、文字列の最初の行の先頭と最後の行の終わりを一致させることから、文字列のすべての行の先頭と終わりを一致させることに^変更します。$

"s" 文字列を1行として扱います。つまり、 .通常は一致しないすべての文字、改行文字まで一致するように変更します。

一緒に使用すると、文字列の改行文字の後ろと前の文字をそれぞれ許可し、一致しながらすべての文字一致を/ms許可します。.^$

おすすめ記事