- 締切済み
複数行のテキスト置換
エディタを用いて複数行にまたがるテキストの置換。 下記のようなテキストがあり あああああああああああああああ いいいいい■■■■■いいいいい ううううう■■■■■ううううう えええええ■■■■■えええええ おおおおおおおおおおおおおおお ■■■■■ ■■■■■ ■■■■■ の部分を ●●●●● ●●●●● ●●●●● に置換したいです。 ただ■を●にしたいのではなく、 ■15文字を検索して ●15文字に置換したいです。 正規表現を考えたんですが思いつきませんでした。 あああああああああああああああ いいいいい■■■■■いいいいい うううう■■■■■うううううう ええええええ■■■■■ええええ おおおおおおおおおおおおおおお このような感じもヒットしそうで・・・ 列も見て検索するといいますか そのようなツール・ソフト・やり方等ございましたら ご教授よろしくお願い致します。
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- tux_the_penguin
- ベストアンサー率42% (69/163)
こんばんは ご質問に正規表現を考えたとあるので正規表現でやってみようとしました。 後半の\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)
え~と、非常に変則的なやり方ですが、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でやってみました。
- tux_the_penguin
- ベストアンサー率42% (69/163)
あぅ(^^; たびたびすみません ●と■が逆でしたね… 可読性の低いものなので混乱させてしまうかと… それから長いですが、一行です。 あ~んど emac ってそれ廉価バージョンのりんごマシーンみたい(^^; s が抜けてました。。 emacs のつもりでした 蛇足書き込み御容赦のほどを m(__)m
お礼
正直なんの話かわかりませんが・・・ ご回答ありがとうございました。
- tux_the_penguin
- ベストアンサー率42% (69/163)
#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書いて頂けると私も後学の足しになります…
お礼
\1\2■■■■■\3\4■■■■■\5\6■■■■■\7\8 この部分がわかりませんでした。 後方参照!? ご回答ありがとうございました。
- tux_the_penguin
- ベストアンサー率42% (69/163)
#3です すみません。大嘘書いてしまいましたm(__)m 後ろの部分は{}使えないですね… おまけに一行単位なので仮りに先ほどの例の い の部分を [あいうえお]にしても、数が揃ってない行の含まれる塊も行によっては変換してしまいますね… 嘘ついたお詫びにもうちょっと探してみます。。(でも期待しないでくださいね(^^;) 他の方からの正解回答がくればいいのですが…
お礼
お手数をかけ申し訳ございません。 ご回答ありがとうございました。
- taka1999
- ベストアンサー率10% (48/465)
#1です。 残念ながらviには、上下の行の内容(相関)まで解析する機能はありません。 先頭から11バイト目からのみ置換対象という編集は有りますが、例題のような5列3行が■というような指定でいるものを知りません。残念ながら、あくまで、行エディタしか私は知りません。お力になれなくて・・・。
お礼
>残念ながらviには、上下の行の内容(相関)まで解析する機能はありません。 上記がわかっただけでも良かったです。 ご回答ありがとうございました。
- tux_the_penguin
- ベストアンサー率42% (69/163)
s/い\{5\}●\{5\}い\{5\}/い\{5\}■\{5\}い\{5\}/
お礼
ご回答ありがとうございました。
- taka1999
- ベストアンサー率10% (48/465)
viエディタの入手方法も記載しておきます。 この中の「kairoya.net」の部分から、取り寄せるのがもっとも良いと思います。
お礼
ものすごい早いご回答ありがとうございます! vim使わせていただきました! ありがとうございました!
- taka1999
- ベストアンサー率10% (48/465)
viエディタで 「:1,$ s/■…■/●…●/」とします。
お礼
コマンドまでありがとうございます! Perlみたいですね。 :1,$ s/■…■/●…●/ だと動かなく :1,$ s/■■■■■/●●●●●/ で置換致しました。(これが失敗の元!?) 説明文がPフォントで見づらいのですが ■■■■■ ■■■■■ ■■■■■ のような場合も置換できてしまい ■■■■■ ■■■■■ ■■■■■ 上記のような場合だけ置換したく、もし方法がございましたらご教授よろしくお願い致します。
お礼
>Sheet1のタブを右クリックして「コードの表示」を選択し、下のマクロを貼り付けます。 こんなやり方があるなんて知りませんでした。 色々なパターンでマクロ実行させていただきましたが、正直私が思ってる置換が出来ませんでした。 例)下記は置換出来ませんでした。 いいいいい■■■■■いいいいい ううううう■■■■■ううううう えええええ■■■■■えええええ おおおおおおおおおおおおおおお でもセル1つにテキスト1文字いれれば、想像している置換が出来るような気がします。。。(256列までしかないのがちょっと問題ですが) あとダンプ(dump)!?とかっていうので置換できないか探しております。 すごい丁寧にマクロ書いていただきありがとうございました。