※ F 送りを変更(挿入、削除)したい (emacs版) NC コードで、F送りを変更したいとき、どうしたらいいか? emacs(エディタ)の関数で書くと次のようです。 (ただし、私はこれを使わず、後述の awk 版を使っています) (defun nc-f (down-f cut-f) "NC コードの F送りを down時 DOWN-Fに、切削時 CUT-F に変更" (interactive "ndownf:\nncut-f:") (if (<= down-f 0) (setq down-f cut-f cut-f 0)) (save-excursion (goto-char (point-min)) (replace-regexp "^\\(F[.0-9-]*\\)*\n\\|F[.0-9-]*" "") (goto-char (point-min)) (replace-regexp "\\(G00\\([^G]\\|G0[^123]\\)*G0[123][^XYZIJKR]*.*\\)\\(\n[^XYZIJKR]*.*\\)" (if (<= cut-f 0) (format "\\1F%d\\3" down-f) (format "\\1F%d\\3F%d" down-f cut-f))))) この関数の動作は次のようです。 まず最初に 空白行、F送りだけの行については行全体を削除、F送りとそれ 以外の部分のある行については、F送り部分だけを削除します。 次に、 G00 ... ... (G0[123] のないコード。複数行可) ... G0[123] ... ... (最初に[XYZIJKR]のある行の行末)DONW-F ... (次に[XYZIJKR]のある行の行末)CUT-F というように、DOWN-F と CUT-F を挿入します。 CUT-F が 0 または負数の場合、挿入されません。 ソースコードを読む人は、e-lisp の正規表現では、 . は改行に一致しませんが、 [^123] は 123 のいずれでもない 1文字に一致し、改行にも一致することに 気をつけてください。 NC コードで ( と ) に挟まれた部分は注釈となりますが、これがあると、 うまく動きません。 ※ F 送りを変更(挿入、削除)したい (awk版) F 送り変更は、単独に実行するときは、perl か emacs で 複数行にわたる置換を実行した方が早いです。(emacs版参照) perl、emacs はファイルを全部メモリに読み込んで(読み込むこと自体は 実メモリがある場合気にならない)複数行置換を実行して、 結果を書き出します。 A | perl ... | B (または A | emacs -b ...| B) というようにフィルタで実行する場合、A が終わるまで(=入力ファイルの 全体が集まるまで)、perl、emacs は 全く処理を始めません。 また、B も perl、emacs が終わるまで(perl、emacs の処理がすべて終わり 出力を始めるまで)処理を始めることが出来ません。 これは [UL]inux では、結構問題になります。 (DOS では、パイプの処理の仕方が違うので、どちらにしても時間がかかる) で、結局 awk で作ることにしました。(一部 bash 使用) F 送りを3つまで指定できるようにしてあります。2段階のアプローチなどに 使えます。 ---------------------------^ downf #!/bin/bash # if [ "$1" == "-h" ] ;then cat <"/dev/stderr" exit } } $1~/^[^(]*G00/ {G0 = 0} $1~/^[^(]*G0[123]/ {if (G0==0) G0 =4} { if (!/^\(/) sub(/F[.0-9]*/,"") ;## delete F if ($0!="") { ## skip a null line if ($0!~/[XYZIJKR]/) { ## not move print } else { printf("%s%s\n",$1,F[G0]); if (G0>1) G0-- } } }' fi ---------------------------$ downf