Sedの文字制限と置換/文字をバイパスしますか?


2

Windows XPを使用しています。

長さが200,000文字の単語を置き換えたいのですが、CMDに問題があります(入力行が長すぎます)。Linuxでは、端末に同じ長さの問題がありますか?

多くの単語を他の多くの単語に置き換えると/、CMDが出力エラーを出すため、文字を置き換えることができません。

この問題を回避する解決策はありますか?


1
単一の200,000文字の単語を別のものに置き換えたいですか?本当にこれをしているのですか?確かに非定型的な使用法。例を入手できますか?(200k全体ではありません...素敵です!)
lornix

@lornixに同意します。おそらく、基本的な問題を示すおもちゃの例が必要でしょう。sedスクリプト内で、141MBのテキストファイルのテキスト置換に* NIXを使用できました。のサポートがsed必要な場合は、間違いなくもっと表示する必要があります。
ephsmith

1
また、を検索または置換する場合は、式の区切り文字に他の何かを使用する必要があることに注意してください。例 の代わりに使用します。どの式にも含まれていない区切り文字を使用します。/seds%search-pattern%replacement%s/search-pattern/replacement/
ephsmith

代替文字を使用する義務は一切ありません//search-patternのそれぞれをにエスケープするだけです\/。この機能は、検索パターンに含まれるものを知っている場合にのみ便利です。あなたは、動的/未知の検索パターンを持っている場合は、あなたはその中で終わることができ、すべての文字を認識する必要があり、検索パターン、および区切り文字として発生しない文字を選択するか、またはそれぞれをエスケープ/します\/。.. 。btw:区切り文字はsearch-patternに関してのみ重要です。検索されているデータが区切り文字と衝突することはありません。
Peter.O

みんなありがとう。変更区切り記号が機能しています。£区切り記号を使用しています。200kは非常に大きな単語です。いいえ、CMDが作業の負荷に耐えられないかどうかを確認したかったのですが、CMDの大きな単語の置換タスクを自動化するバッチファイルを作成できますか。
user143822

回答:


0

Linuxターミナルのコマンドラインに関する質問について。答えは次のとおりです。はるかに大きい文字列を処理できます。これは、使用可能なRAMの量に大きく依存します。例えば。コマンドラインから、printf '%s'20,000,000バイトの文字列で実行しました。問題ありませんでした。また、sed.exe(Linux ワイン環境で)実行しました。これもうまくいきました...コマンドラインの制限が何であれ、そのような大きな文字列を供給しているプログラムがコマンド入力の最大サイズとして処理できるものに依存します。

しかし、ある時点で最大値に達するため、このような大きな文字列をプログラムに渡すことは珍しい/奇妙な状況です。

このsedような大きな文字列では、次の2つのいずれかを実行できます。

  1. データをファイルに書き込み、次を使用します。

    sed "s@ab/cd@AB_CD@" my_data_file

  2. パイプ(|)sedの標準入力へのコマンドの出力:

    my_data_app | sed "s@ab/cd@AB_CD@"

sed自体には行の長さの制限がある場合がありますが、メモリからはGNU sedの制限は非常に高いことに注意してください。

また、デフォルトの代わりに、/を使用しましたが@、お好きなものをほとんど使用できます。


@ user143822。* nixはUTF-8テキストファイルにエンコーディングを使用することに注意してください。Windowsはサポートしていません。
Peter.O

はい、テキストファイルはUTF-8エンコーディングで、日本語、中国語の文字もありますが、Windows CMDを使用してsedでコマンドを起動することを余儀なくされたり、.batファイルなどを作成できますか?
user143822

とても喜んで走りsed.exeましたwine。私が使用した「sed.exe」は、GNU-for Windowsバージョン4.2でした...次の内容batを含むファイルを使用しました: sed.exe -n "s@a/@-=@gp" file.in > file.out...また、stdinの動作へのパイプ:type file.in | sed.exe -n "s@a/@-=@gp" > file.out
-Peter.O

わかりました。しかし、もし私が多くの単語を他の多くの単語で置き換えたいが、いくつかのファイルがある場合は?どのコマンドを使用する必要がありますか?<xxx.txt> yyy.txtコマンドは、異なるファイルにある単語ではなく、1つのファイルにある単語に対してのみ有効です。
user143822

多くの置換について:sed "s/one/ONE/g; s/two/TWO/g; s/etc/ETC/g" file.in >file.out...多くの入力ファイルで再置換すると、それぞれを個別に(もちろん)行うことができますが、一度にすべてを行うには:sed "s/a/b" file1 file2 file3 > file.out ..これはどういう意味ですか?.. を使用する必要がないことに注意してください<xxx.txt。特別な理由がない限り、実際には使用しないでください。xxx.txtパターンがでうまく動作した直後に、sed入力ファイル名をパラメーターとして受け入れます(1つまたは複数のファイル名)。
Peter.O

1

Win7のWindowsでsedを使用しています。置換文字列が大きすぎるという問題が発生しました。私はこれを使用して構成ファイルのセクションを置換していましたが、約10,000文字後に動作しなくなり、指定されたファイルが見つかりませんというエラーが表示されました。

結局、置換を2つの操作に分割する必要がありました。最初にデータの1/2を入力し、### ENDOFSECTION ###で終了します。その後、他の置換により、### ENDOFSECTION ###を残りのデータに置き換えます。これが単なるウィンドウ制限であるかどうかはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.