• 締切済み

複数行のテキスト置換

エディタを用いて複数行にまたがるテキストの置換。 下記のようなテキストがあり あああああああああああああああ いいいいい■■■■■いいいいい ううううう■■■■■ううううう えええええ■■■■■えええええ おおおおおおおおおおおおおおお      ■■■■■      ■■■■■      ■■■■■ の部分を      ●●●●●      ●●●●●      ●●●●● に置換したいです。 ただ■を●にしたいのではなく、 ■15文字を検索して ●15文字に置換したいです。 正規表現を考えたんですが思いつきませんでした。 あああああああああああああああ いいいいい■■■■■いいいいい うううう■■■■■うううううう ええええええ■■■■■ええええ おおおおおおおおおおおおおおお このような感じもヒットしそうで・・・ 列も見て検索するといいますか そのようなツール・ソフト・やり方等ございましたら ご教授よろしくお願い致します。

みんなの回答

回答No.9

こんばんは ご質問に正規表現を考えたとあるので正規表現でやってみようとしました。 後半の\1\2\3\4…というのは前半に出てくる\(…\)に括られたパターンの参照です。正規表現のひとつです。 それぞれのパターンに前から出てきた順番に番号が振られていきます。 #6の例では \1 は \([あ-お]\{15\}\n\) で 続く \2 は \([あ-お]\{5\}\) で 続く \3 は \([あ-お]\{5\}\n\) の部分ということです。 これを踏まえて普通の言葉で言い替えると (パターン1) → (「あ」~「お」のいずれか一文字)を15回繰り返した後、改行 (パターン2) → (「あ」~「お」のいずれか一文字)を5回繰り返し ●\{5\}   → ●を5回繰り返し (パターン3) → (「あ」~「お」のいずれか一文字)を5回繰り返した後、改行   ・   ・   ・   ・ 上記を (パターン1)(パターン2)■■■■■(パターン3)(パターン4)■■■■■(パターン5)(パターン6)■■■■■(パターン7)(パターン8) に置換する。と言う意味です。 とっても読み難いので「\」を全部とっぱらって()毎に分けて見ると良いかもしれません。 パターン3、5、7のところは5文字決め打ちで書きましたが「0文字以上+改行」で済みそうですね。また、最初の「あ15個」と最後の「お15個」も要らなかったですよね? 要らないところを削って参照番号を適宜にずらせば使えると思います。 で。 データは総じて一次元に並んでいます。わかりやすく言うと 『 ☆☆あいうえお★★ ☆☆かきくけこ★★ ☆☆さしすせそ★★ 』 と見えるデータは実は 『 ☆☆あいうえお★★(改行)☆☆かきくけこ★★(改行)☆☆さしすせそ★★(終わり) 』 と一列に並んでいます。(改行)も他の文字と同じくただ単にデータのひとつとして並びに加わっているだけです。((終わり)と言うデータはないことも多いです。)   なので「い」と「き」の関係は 縦に一段 と言うような事は言い得ないわけです。 前か後ろに何文字分とかしか言えないのですが、その際(改行)も「一文字」分に数えなければなりません。(改行コードは環境によって1バイトのことも2バイトのこともあります。Windowsでは2バイトです。) そういうわけなので長いテキストデータの中から 『 あいうえお かきくけこ さしすせそ 』 を探し出すためには、「あ」の前、「お」と「か」の間、「こ」と「さ」の間 をそれぞれ把握しなければなりません。そういうわけで#6では「あ」が15個~「お」が15個まで一気に検索対象にしたわけです。 ご質問のタスクはそれほどややこしいはなしです。 そういうわけで二次元構成をもつスプレッドシートを使うという#8さんのご提案は非常に的確かつ有効だと思います。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.8

え~と、非常に変則的なやり方ですが、Excelに貼り付けてマクロで処理するという方法です。 Excelを起動し、Sheet1のタブを右クリックして「コードの表示」を選択し、下のマクロを貼り付けます。 Sub ReplaceText()   Const Before As String = "■■■■■"   Const After As String = "●●●●●"   Dim r As Range   Dim Start_Column As Integer   Set r = Range("A:A").Find(Before)   If r Is Nothing Then     Exit Sub   End If      Start_Column = InStr(r.Text, Before)   If InStr(r.Offset(1, 0), Before) = Start_Column And _    InStr(r.Offset(2, 0), Before) = Start_Column Then     Range(r, r.Offset(2, 0)).Replace What:=Before, Replacement:=After   End If End Sub Excelの画面に戻って、適当に名前をつけて保存します。 置換したいテキストをエディタで開いて全部コピーし、ExcelのA1を選択して貼り付けます。(A列の各行に貼り付けられます) Alt+F8でマクロの実行画面を出し、上記のマクロを実行します。 置換が行われるので、Ctrl+Aで全て選択し、エディタに貼り付けます。 エディタでマクロ機能があるもの(秀丸とか)を活用するという手もあると思うのですが、そっち方面はあまり詳しくないので、あえてExcelでやってみました。

hatuokwave
質問者

お礼

>Sheet1のタブを右クリックして「コードの表示」を選択し、下のマクロを貼り付けます。 こんなやり方があるなんて知りませんでした。 色々なパターンでマクロ実行させていただきましたが、正直私が思ってる置換が出来ませんでした。 例)下記は置換出来ませんでした。 いいいいい■■■■■いいいいい ううううう■■■■■ううううう えええええ■■■■■えええええ おおおおおおおおおおおおおおお でもセル1つにテキスト1文字いれれば、想像している置換が出来るような気がします。。。(256列までしかないのがちょっと問題ですが) あとダンプ(dump)!?とかっていうので置換できないか探しております。 すごい丁寧にマクロ書いていただきありがとうございました。

回答No.7

あぅ(^^; たびたびすみません ●と■が逆でしたね… 可読性の低いものなので混乱させてしまうかと… それから長いですが、一行です。  あ~んど emac ってそれ廉価バージョンのりんごマシーンみたい(^^; s が抜けてました。。 emacs のつもりでした 蛇足書き込み御容赦のほどを m(__)m

hatuokwave
質問者

お礼

正直なんの話かわかりませんが・・・ ご回答ありがとうございました。

回答No.6

#3=#5です  とっても冗長で美しくないので、お薦めするのは気がひけるのですが、viで、ってことで実現はできたので一応書かせていただきます。 もっと賢いエディタでマクロ書いたほうがきっとすっきりしそうですがそちらの環境がわからないのでviにこだわってみました。 当方はbash上のviですが、viは亜種が多いのでもしかしたらうまくいかないかもしれません。。。 s/\([あ-お]\{15\}\n\)\([あ-お]\{5\}\)●\{5\}\([あ-お]\{5\}\n\)\([あ-お]\{5\}\)●\{5\}\([あ-お]\{5\}\n\)\([あ-お]\{5\}\)●\{5\}\([あ-お]\{5\}\n\)\([あ-お]\{15\}\)/\1\2■■■■■\3\4■■■■■\5\6■■■■■\7\8/g とっても見難くて(醜くて)恐縮です。 #どなたかemacにLisp書いて頂けると私も後学の足しになります…

hatuokwave
質問者

お礼

\1\2■■■■■\3\4■■■■■\5\6■■■■■\7\8 この部分がわかりませんでした。 後方参照!? ご回答ありがとうございました。

回答No.5

#3です すみません。大嘘書いてしまいましたm(__)m 後ろの部分は{}使えないですね…  おまけに一行単位なので仮りに先ほどの例の い の部分を [あいうえお]にしても、数が揃ってない行の含まれる塊も行によっては変換してしまいますね… 嘘ついたお詫びにもうちょっと探してみます。。(でも期待しないでくださいね(^^;) 他の方からの正解回答がくればいいのですが…

hatuokwave
質問者

お礼

お手数をかけ申し訳ございません。 ご回答ありがとうございました。

  • taka1999
  • ベストアンサー率10% (48/465)
回答No.4

#1です。 残念ながらviには、上下の行の内容(相関)まで解析する機能はありません。 先頭から11バイト目からのみ置換対象という編集は有りますが、例題のような5列3行が■というような指定でいるものを知りません。残念ながら、あくまで、行エディタしか私は知りません。お力になれなくて・・・。

hatuokwave
質問者

お礼

>残念ながらviには、上下の行の内容(相関)まで解析する機能はありません。 上記がわかっただけでも良かったです。 ご回答ありがとうございました。

回答No.3

s/い\{5\}●\{5\}い\{5\}/い\{5\}■\{5\}い\{5\}/

hatuokwave
質問者

お礼

ご回答ありがとうございました。

  • taka1999
  • ベストアンサー率10% (48/465)
回答No.2

viエディタの入手方法も記載しておきます。 この中の「kairoya.net」の部分から、取り寄せるのがもっとも良いと思います。

参考URL:
http://www.faireal.net/articles/4/11/#d11222
hatuokwave
質問者

お礼

ものすごい早いご回答ありがとうございます! vim使わせていただきました! ありがとうございました!

  • taka1999
  • ベストアンサー率10% (48/465)
回答No.1

viエディタで 「:1,$ s/■…■/●…●/」とします。

hatuokwave
質問者

お礼

コマンドまでありがとうございます! Perlみたいですね。 :1,$ s/■…■/●…●/ だと動かなく :1,$ s/■■■■■/●●●●●/ で置換致しました。(これが失敗の元!?) 説明文がPフォントで見づらいのですが  ■■■■■ ■■■■■   ■■■■■ のような場合も置換できてしまい ■■■■■ ■■■■■ ■■■■■ 上記のような場合だけ置換したく、もし方法がございましたらご教授よろしくお願い致します。