のみアクセスできますbusybox 1.27.2
。
私は現在500,000以上の単語と6,000ページを超える辞書をしています(PDFから抽出してGhostscriptを使用してプレーンテキストに変換)。20MB
.txt
ファイルにあります。最初に、この辞書のすべての単語には、->
単語を簡単に検索できるようにリーダーがあります。
私が達成したいのは、それを*nix
フレンドリーにすることです。これは次のことを意味します
grep -e '->myfancyword' ./dictionary.txt
。
次の結果を得る必要があります。
->fancyword: This is a very fancy word. *Definition going on for more than 6 lines*
\n
各単語のすべての定義が1つの長い行にあるように、すべての改行を削除すると簡単になります。大丈夫です。すべてを\n
次に置き換えてtr -d '\n'
結果の出力を得ることができるsed 's/->/\n->/g'
ので、すべての単語の定義を1行で取得できます。このように大きな文書も5秒以内に完了できます。
所望の結果をほとんど得たが、完璧ではなかった。私はこれを行うことができgrep -e '->word' ./dictionary.txt
、単語の完全な定義を得ることができます。しかし、見た目には完璧ではありません。
出力結果が気に入らない理由は、元のPDFがA4
ページに印刷されるようにフォーマットされているためです。つまり、長い単語が現れたときに切り捨てられます。このように:
例えば
->word: This is a defini-
tion.
以前のワークフローを使用してファイルを処理すると、次の結果が表示されます。->word: This is a defini- tion.
希望の単語を検索するとき。
これまで私が達成したことは次のとおりです。
- 入力する
->firstword: This is a defini-
tion.
->secondword: This is a second defini-
tion.
アプリケーション
tr -d '\n' < ./dictionary.txt > ./dictionary2.txt
出力は次のとおりです
->firstword: This is a defini- tion. ->secondword: This is a second defini- tion.
走る:
sed -e 's/->/\n->/g' ./dictionary2.txt
最終結果は次のとおりです。
出力
->firstword: This is a defini- tion.
->secondword: This is a second defini- tion.
-\n
2番目の手順を実行する前に、ダッシュと新しい線()を削除して、切り捨てられた線の両方を「接続」したいと思います。
だから私の質問は:行の末尾にダッシュ-
と改行文字()を含む\n
特定の文字列をどのように変更または削除できますか?-\n
私が得たいものは次のとおりです。
出力(ダッシュとスペース(-
)がもう存在しないことを確認)
->firstword: This is a definition.
->secondword: This is a second definition.
ありがとうございます。
編集する:
以下はPDFファイルのページです。
->abigeato. (Del lat. abigeatus). 1. m. Am. Hurto de ganado.
->abigeo. (Del lat. abigeus). 1. m. Am. Ladrón de ganado.
->abigotado, da. 1. adj. bigotudo.
->abinar. 1. tr. rur. y vulg. Binar la tierra.
->abintestato. (De ab intestato). 1. m. Der. Procedimiento judicial sobre herencia y
adjudicación de bienes de quien muere sin testar.
->abiogénesis. (De a-2, bio- y -génesis). 1. f. Producción hipotética de seres vivos par-
tiendo de materia inerte. 2. f. Bioquím. síntesis abiótica.
->abiótico, ca. 1. adj. Biol. Se dice del medio en que no es posible la vida. V. síntesis
abiótica
->abipón, na. 1. adj. Se dice del individuo de un pueblo amerindio que habitaba cerca del
Paraná. U. t. c. s. 2. adj. Perteneciente o relativo a los abipones. 3. m. Lengua de la familia
guaicurú hablada por los abipones.
->abisagrar. 1. tr. Clavar o fijar bisagras en las puertas y sus marcos, o en otros objetos.
->abisal. (Del lat. abyssus). 1. adj. abismal (|| perteneciente al abismo). 2. adj. Se dice de
las zonas del mar profundo que se extienden más allá del talud continental, y corresponden a
profundidades mayores de 2000 m. 3. adj. Perteneciente o relativo a tales zonas.
->abiselar. 1. tr. biselar.
->abisinio, nia. 1. adj. Natural de Abisinia, hoy Etiopía. U. t. c. s. 2. adj. Perteneciente o re-
lativo a este país de África. 3. m. Lengua abisinia. V. rito abisinio
->abismado, da. (Del part. de abismar). 1. adj. Dicho de una persona, de su expresión, de
su gesto, etc.: Ensimismados, reconcentrados. 2. adj. Heráld. Dicho de una pieza del escudo:
Puesta en el abismo.
->abismal (1). (Del ár. hisp. almismár, y este del ár. clás. mismar). 1. m. Cada uno de los
clavos con que se fijaba en el asta el hierro de la lanza.abismal2. 1. adj. Perteneciente o re-
lativo al abismo. 2. adj. Muy profundo, insondable, incomprensible.
->abismar. 1. tr. Hundir en un abismo. U. t. c. prnl. 2. tr. Confundir, abatir. U. t. c. prnl. 3.
prnl. Entregarse del todo a la contemplación, al dolor, etc. 4. prnl. Am. sorprenderse (|| con-
moverse con algo imprevisto o raro).
->abismático, ca. 1. adj. abismal2.
->abismo. (Quizá del lat. vulg. *abyssimus, der. de abyssus, y este del gr. , sin fondo). 1.
m. Profundidad grande, imponente y peligrosa, como la de los mares, la de un tajo, la de una
sima, etc. U. t. en sent. fig. Se sumió en el abismo de la desesperación. 2. m. infierno (|| lugar
de castigo eterno). 3. m. Cosa inmensa, insondable o incomprensible. 4. m. Diferencia
grande entre cosas, personas, ideas, sentimientos, etc. 5. m. Heráld. Punto o parte central
del escudo. 6. m. Nic. Maldad, perdición, ruina moral.
Ghostscriptを使用して抽出が完了した後にプレーンテキストをgrepすると、次のような結果が得られます(dos2unixとしてのみ処理されます)。
grep -e '->abiog' ./rae-dos2unix.txt
->abiogénesis. (De a-2, bio- y -génesis). 1. f. Producción hipotética de seres vivos par-
これは、テキストに対して前のステップ(1-4)を実行したときに発生します。 greping すると、次のような結果が得られます。
grep -e '->abiog' ./rae-una-linea.txt
->abiogénesis. (De a-2, bio- y -génesis). 1. f. Producción hipotética de seres vivos par- tiendo de materia inerte. 2. f. Bioquím. síntesis abiótica.
ベストアンサー1
これはPerlでは非常に簡単です。 Perl の-0
オプションは、入力レコード区切り文字として改行文字の代わりに NUL 文字を使用するように指示するため、入力に NUL 文字がない場合は、入力ファイル全体を 1 つのレコードとして扱います。 NUL 文字があっても、最初のレコードと同じように後続のレコードを処理し続けます。
注:これは、入力ファイル全体がメモリーに収まらなければならないことを意味します。 RAMが16GB以上の最新システムでは問題になりません。 RAMが不足していますが、十分なスワップスペースを持つ古いシステムではまだ動作しますが、速度がはるかに遅くなります。
$ cat input.txt
->firstword: This is a defini-
tion.
->secondword: This is a second defini-
tion.
$ perl -0 -p -e 's/-\s*\n//g' input.txt
->firstword: This is a definition.
->secondword: This is a second definition.
これにより、ゼロ個以上の空白文字(\s
、以下を参照)と改行文字(\n
)が続くすべてのハイフンシーケンスが削除されます。
\s*
末尾の空白文字を一致させるために使用される正規表現の一部可能行の終わり - 私の経験では、テキスト行に末尾の空白があるのは非常に一般的です(そして印刷されない文字、つまり見えないので見つけるのは難しいです)。または *
(0個以上スペース文字)または[ \t]*
(0個以上のスペースまたはタブ)または\h*
(0個以上水平空白文字)の代わりに\s*
。
からman perlre
:
空白と見なされる文字セットは、Unicodeで「モード空白」文字と呼ばれる文字です。
U+0009 CHARACTER TABULATION U+000A LINE FEED U+000B LINE TABULATION U+000C FORM FEED U+000D CARRIAGE RETURN U+0020 SPACE U+0085 NEXT LINE U+200E LEFT-TO-RIGHT MARK U+200F RIGHT-TO-LEFT MARK U+2028 LINE SEPARATOR U+2029 PARAGRAPH SEPARATOR
メモ:
- 「ハイフン」や「ダッシュ」の文字
-
だけを使用できるわけではありません。 WikipediaにはUnicodeをリストするページがあります。ハイフンそしてスプリント数値。幸いなことに、PerlはUnicode処理に優れているため、すべてのダッシュカテゴリ文字を一致させるのではなく\p{Dash}
(または)を使用するように1行のコードを書き換えることができます。\p{Pd}
-
$ perl -0 -p -e 's/\p{Dash}\h*\n//g' input.txt
->firstword: This is a definition.
->secondword: This is a second definition.
ただし、これによりダッシュはハイフンとして扱われます(したがって、ハイフンと同様に行末のダッシュが削除されます)。括弧の代わりにダッシュを使用することも珍しくありません。 「ハイフン」が使用されなくなったという警告メッセージが気に入らない場合は、代わりに\p{Hyphen}
使用できます。\p{Dash}
あるいは、ハイフンで処理したいUnicodeコードポイントのみを含む角括弧式を使用できます。
perl -0 -p -e 's/[\N{U+002D}\N{U+00AD}\N{U+2010}\N{U+2011}]\h*\n//g' input.txt
すべての単語の定義をで始めないことをお勧めします
->
。これにより、grepを使用して単語を検索することが不必要にぎこちなくなります。検索文字列は引用符で囲む必要があります(シェルがリダイレクト>
に使用するため)、前になければなりません--
(-
そうでなければ、grepは検索パターンをオプションと見なすため)。 。たとえば、次の操作しか実行できません。grep ^firstword: dictionary.txt
代わりに、次のことを行う必要があります。
grep -- '^->firstword:' dictionary.txt
より良い例として、画像からテキストを抽出した。tesseract-ocrそして、後に来ないすべての改行も削除するPerl one-linerバージョンで実行してください->
。
$ cat input2.txt
->abigeato. (Del lat. abigeatus). 1. m. Am. Hurto de ganado.
->abigeo. (Del lat. abigeus). 1. m. Am. Ladrén de ganado.
->abigotado, da. 1. adj. bigotudo.
->abinar. 1. tr. rur. y vulg. Binar la tierra.
->abintestato. (De ab intestato). 1. m. Der. Procedimiento judicial sobre herencia y
adjudicacion de bienes de quien muere sin testar.
Eiiftiénesis. (De a-2, bio- y -génesis). 1. f. Produccién hipotética de seres vivos par-
tiendo de materia inerte. 2. f. Bioquim. sintesis abistica,
->abidtico, ca. 1. adj. Biol. Se dice del medio en que no es posible la vida. V. sintesis
abidtica
->abipon, na. 1. adj. Se dice del individuo de un pueblo amerindio que habitaba cerca del
Parana. U. t.c. s. 2. adj. Perteneciente o relativo a los abipones. 3. m. Lengua de la familia
guaicurt hablada por los abipones.
->abisagrar. 1. tr. Clavar o fijar bisagras en las puertas y sus marcos, 0 en otros objetos.
->abisal. (Del lat. abyssus). 1. adj. abismal (|| perteneciente al abismo). 2. adj. Se dice de
las zonas del mar profundo que se extienden mas alla del talud continental, y corresponden a
$ perl -0 -p -e 's/[\N{U+002D}\N{U+00AD}\N{U+2010}\N{U+2011}]\h*\n//g; s/\n+(?!->)//g' input2.txt
->abigeato. (Del lat. abigeatus). 1. m. Am. Hurto de ganado.
->abigeo. (Del lat. abigeus). 1. m. Am. Ladrén de ganado.
->abigotado, da. 1. adj. bigotudo.
->abinar. 1. tr. rur. y vulg. Binar la tierra.
->abintestato. (De ab intestato). 1. m. Der. Procedimiento judicial sobre herencia yadjudicacion de bienes de quien muere sin testar.Eiiftiénesis. (De a-2, bio- y -génesis). 1. f. Produccién hipotética de seres vivos partiendo de materia inerte. 2. f. Bioquim. sintesis abistica,
->abidtico, ca. 1. adj. Biol. Se dice del medio en que no es posible la vida. V. sintesisabidtica
->abipon, na. 1. adj. Se dice del individuo de un pueblo amerindio que habitaba cerca delParana. U. t.c. s. 2. adj. Perteneciente o relativo a los abipones. 3. m. Lengua de la familiaguaicurt hablada por los abipones.
->abisagrar. 1. tr. Clavar o fijar bisagras en las puertas y sus marcos, 0 en otros objetos.
->abisal. (Del lat. abyssus). 1. adj. abismal (|| perteneciente al abismo). 2. adj. Se dice delas zonas del mar profundo que se extienden mas alla del talud continental, y corresponden a
->
最終出力ファイルからシーケンスを削除することをお勧めします。テキストを操作するのに便利なマークアップですが、後で問題が発生する可能性があります。
@zevzekのコメントは、「多くのRAMの使用」の問題をカバーしています。入力レコード区切り文字として NUL を使用しないでください。代わりに区切り->
文字として使用してください。これにより、Perlスクリプトはファイル全体を一度に読むのではなく、一度に1つの単語定義を読み取ることができます。これにより、使用可能なすべてのRAMを使用せずにシステムがスワップされるため、非常に大きな入力ファイルを処理するとより速く実行されます。
これでマークアップを扱っているので、スクリプトに他の変更を適用する必要があります。スタート新しい単語の定義は次のとおりです。終わり以前の定義。具体的には以下が必要です。
- コマンドラインオプション
-p
(常に現在のレコード出力)を-n
(指定した場合にのみ現在のレコード出力)に変更します。 - 行末文字の削除(Perlの
chomp()
機能がこれを行う) - 次に、入力レコードが空であるか、空白のみが含まれていることを確認します。想像最初の実際のレコード「abigeato」の前に空のレコードがあり、それを印刷したくありません。 (仮想空のレコードが突然現れるのはなぜですか?
->
今は新しいレコードの始まりではなくレコードの終わりを示すためです->
。->abigeato
- 変更されたレコードを印刷するには、「->」と改行文字を使用します。
全体として、次は最後の行を変更します。
$ perl -0 -p -e 's/[\N{U+002D}\N{U+00AD}\N{U+2010}\N{U+2011}]\h*\n//g;
s/\n+(?!->)//g' input2.txt
これに関して:
perl -n -e 'BEGIN { $/="->" };
chomp;
next if m/^\s*$/;
s/[\N{U+002D}\N{U+00AD}\N{U+2010}\N{U+2011}]\h*\n//g;
s/\n+//g;
print "->$_\n"' input2.txt
このバージョンの出力は、最終出力行が\n
改行文字()で終わることを除いて、元のバージョンと同じです。元のバージョンはこれを保証するものではなく、実際に次のすべての改行文字を削除してこれを防ぎます->
。すべての行が次に終わる場合、技術的にはファイルはUnixのテキストファイルなので、これは無料ボーナスです。ほとんどの場合、これは問題ではありませんが(少なくとも最新バージョンの標準テキスト処理ツールではありません)、\n
「テキストファイル」の最後の行が\n
。
(ところで、元の問題はENDブロックを追加し、出力の末尾に改行文字を再追加することで解決できますEND { print "\n" }
。)
$/
の変数と同様に、入力レコード区切り文字を定義するPerl変数です(man perlvar
Perl事前定義/特殊/制御変数の詳細を参照)。以前は、Perlのオプションを使用してNUL文字に設定しました(詳細については、Perlコマンドラインオプションを参照)。RS
awk
-0
man perlrun
BEGIN
while(<>) { ..... }
ステートメントは、スクリプトの先頭、Perl-p
またはオプションを使用して発生する暗黙のループ(perlがsuperまたはそれぞれ-n
に似て動作するようにする)の前後に一度発生します。同様に、ステートメントはすべての入力を読み取って処理した後、スクリプトの最後に一度発生します。sed
sed -n
END