特定文字を含まない行は削除するNo.03048
Folly さん 02/03/15 19:27
 
こんばんは、今日入会した者ですが、早速。

秀丸エディタで(マクロ)、有る特定の文字を含まない行は削除したいのですが、ど
のような方法があるか、皆さんのお知恵をお貸し下さい。

たとえば、
------------
空間: モデル空間
ハンドル = 3A7
始点,  X= 629.6030  Y= 347.6952  Z=   0.0000
終点,  X= 632.6030  Y= 347.6952  Z=   0.0000
長さ =   3.0000,  XY 平面の角度 =      0
デルタ X =   3.0000, デルタ Y =    0.0000, デルタ Z =   0.0000
線分      画層: "構造"
空間: モデル空間
ハンドル = 3A4
始点,  X= 631.1030  Y= 347.6952  Z=   0.0000
------------
と有ったとき、"長さ"とある行だけを抜き出すような動作です。

"先頭が数字ではない物"などで有れば、
結構簡単に
^[^0-9].+\n
をnullで置き換えれば消えると思うのですが、
2バイト文字でさらに単語を扱うとなると昨日今日始めた僕の正規表現では解らなく
て・・・・

教えてください。

[ ]
RE:03048 特定文字を含まない行は削除するNo.03050
山紫水明 さん 02/03/15 20:16
 
 Follyさん,こんばんは。

》"長さ"とある行だけを抜き出すような動作です。

検索語:^[^長][^さ].*\n
置換語:(なし)
正規表現

で全置換ということどうでしょう。

     では, (^^)/~
                                        山紫水明

[ ]
RE:03048 特定文字を含まない行は削除するNo.03055
きいろいまふらあ さん 02/03/16 00:40
 
>秀丸エディタで(マクロ)、有る特定の文字を含まない行は削除したいのですが、ど

特定の文字「列」ですよね?

1文字だったら例えば「^[^あ]*\n」をnullに置換でおしまい。

2文字以上の場合、即座に思い付くのは、grepして、「ファイル名(行):」の
部分をあとから消してやるという方法です。

で、その方法については2番会議室の7387番の発言から始まるスレッドに詳
しいです。
#って、今でも見られるのかな?

[ ]
RE:03048 特定文字を含まない行は削除するNo.03056
白雲斎 さん 02/03/16 02:30
 
 白雲斎 と申します。

対象が Windows 2000 (XP?) 限定での話になりますが、

"find" もしくは "findstr" を使うと言うのはどうでしょうか。
("find","findstr"はDOSの外部コマンド)
サイズの大きい物を処理する場合は、ファイルを渡して、ファイルに出力する
ほうが良いかも...

// Sample.mac ここから ----------------------------------------
// 行頭の空白のみ全角で記されています。(コピーするときは注意)

$word = "長さ";    // 検索文字列
if (!selecting) selectall;

menu "マッチ行を抽出",
  "アンマッチ行を抽出",
  "マッチ行を抽出(行頭パターン)",
  "アンマッチ行を抽出(行頭パターン)";
if (result == 0) endmacro;
else if (result == 1) {     // Matched
  run "find \"" + $word + "\" <con >con";
} else if (result == 2) {   //UnMatched
  run "find /v \"" + $word + "\" <con >con";
} else if (result == 3) {   // Matched_ex
  run "findstr /b \"" + $word + "\" <con >con";
} else {                    // UnMatched_ex
  run "findstr /v /b \"" + $word + "\" <con >con";
}
gofiletop;
endmacro;

// Sample.mac ここまで ----------------------------------------


※以下の文を新規秀丸に貼り付けて実行しました。

空間: モテ゛ル空間
ハント゛ル = 3A7
始点,  X= 629.6030  Y= 347.6952  Z=   0.0000
終点,  X= 632.6030  Y= 347.6952  Z=   0.0000
長さ =   3.0000,  XY 平面の角度 =      0
テ゛ルタ X =   3.0000, テ゛ルタ Y =    0.0000, テ゛ルタ Z =   0.0000
線分      画層: "構造"
空間: モテ゛ル空間
ハント゛ル = 3A4
始点,  X= 631.1030  Y= 347.6952  Z=   0.0000

[ ]
RE:03050 特定文字を含まない行は削除するNo.03058
Folly さん 02/03/16 08:31
 
> Follyさん,こんばんは。
こんばんは、
早速有り難うございます。

>》"長さ"とある行だけを抜き出すような動作です。
>検索語:^[^長][^さ].*\n
>置換語:(なし)
>正規表現
>で全置換ということどうでしょう。
それは自分も考えたんですが、たとえばこんな風に残る可能性があると思いまして。
長さ =   5.0912,  XY 平面の角度 =     45
長さ =   3.6297,  XY 平面の角度 =     45
長さ =   5.0912,  XY 平面の角度 =     45
長さ =   5.0912,  XY 平面の角度 =     45
長いかも
長いよ
長ければ

さて・・

[ ]
RE:03058 特定文字を含まない行は削除するNo.03059
Folly さん 02/03/16 08:47
 
はっと気がつきました。
>>検索語:^[^長][^さ].*\n
これが^[^長][さ].*\n
なら・・・あ、だめだ。

残った物から
^[長][^さ].*\n
とやらないとダメですよね?
う〜む。

[ ]
RE:03055 特定文字を含まない行は削除するNo.03060
Folly さん 02/03/16 08:50
 
>>秀丸エディタで(マクロ)、有る特定の文字を含まない行は削除したいのですが、ど
>
>特定の文字「列」ですよね?
>
>1文字だったら例えば「^[^あ]*\n」をnullに置換でおしまい。
>
>2文字以上の場合、即座に思い付くのは、grepして、「ファイル名(行):」の
>部分をあとから消してやるという方法です。
>
>で、その方法については2番会議室の7387番の発言から始まるスレッドに詳
>しいです。
>#って、今でも見られるのかな?
見られないようです・・・
grepってだいぶ前から気になって入るんですが、
ヘルプ参照ですね。

[ ]
RE:03058 特定文字を含まない行は削除するNo.03062
山紫水明 さん 02/03/16 10:59
 
 Follyさん,こんにちは。

》長いかも
》長いよ
》長ければ

 失礼しました。だめですね。m(__)m
 きいろいまふらあさんの言われるように grep を使ったほうがいいようです。
 grep で選択して,ブロック選択でファイル名の部分を消してしまえばがいいで
すね。

 マクロは白雲斎さんが提案されていますが,つぎのようのものも。

//---------------------------------------------
localgrep "^長さ", regular;
replaceallfast "^.+\\f長さ", "\\1", regular;
endmacro;
//---------------------------------------------

あるいは,ファイル名に「長さ」があったらまずいので,

replaceallfast "^[^)]+\\): ", "", regular;

を使った方がいいかも。

     では, (^^)/~
                                        山紫水明

[ ]
RE:03062 特定文字を含まない行は削除するNo.03063
Folly さん 02/03/16 11:02
 
> きいろいまふらあさんの言われるように grep を使ったほうがいいようです。
> grep で選択して,ブロック選択でファイル名の部分を消してしまえばがいいで
>すね。
> マクロは白雲斎さんが提案されていますが,つぎのようのものも。
>//---------------------------------------------
>localgrep "^長さ", regular;
>replaceallfast "^.+\\f長さ", "\\1", regular;
>endmacro;
>//--------------------------------------------
>あるいは,ファイル名に「長さ」があったらまずいので,
>replaceallfast "^[^)]+\\): ", "", regular;
>を使った方がいいかも。

むむぅ、高度だな。。
ちょっと勉強してやってみます。

[ ]
RE:03062 特定文字を含まない行は削除するNo.03065
Folly さん 02/03/16 12:23
 
> grep で選択して,ブロック選択でファイル名の部分を消してしまえばがいいで
>すね。
> マクロは白雲斎さんが提案されていますが,つぎのようのものも。
>//---------------------------------------------
>localgrep "^長さ", regular;
>replaceallfast "^.+\\f長さ", "\\1", regular;
>endmacro;
>//---------------------------------------------
>あるいは,ファイル名に「長さ」があったらまずいので,
>replaceallfast "^[^)]+\\): ", "", regular;
>を使った方がいいかも。
これはだいぶ良い感じですね。
これで実現は出来そうです。
windowが新たに出来てしまうのはあまりうれしくないので、ガチャガチャやってみま
す。

AutoCADのlogから拾い集めることをやっているのですよ。
だいぶ趣味で。^^;

[ ]
RE:03065 特定文字を含まない行は削除するNo.03066
山紫水明 さん 02/03/16 14:58
 
 Follyさん,こんにちは。

》windowが新たに出来てしまうのはあまりうれしくないので、ガチャガチャやって
》みます。

 うまくいきましたか?

 grep でやるとどうしても新しい Window ができてしまいます。
 元のテキスト自体を変更したいということであれば,置換を使うということに
なるでしょうね。
 手動で2回やるか,同じことを次のマクロでやるか,というところでしょうか。

//----------------------------------------------------------------
replaceallfast "^[^長].+\\n", "", regular;
replaceallfast "^.[^さ].*\\n", "", regular;
endmacro;
//----------------------------------------------------------------

     では, (^^)/~
                                        山紫水明

[ ]
RE:03066 特定文字を含まない行は削除するNo.03067
きいろいまふらあ さん 02/03/17 00:37
 
>replaceallfast "^[^長].+\\n", "", regular;
>replaceallfast "^.[^さ].*\\n", "", regular;

「長さ」で始まる行以外を削除するってことでよいのなら(なんかそんな話にな
ってるような気がしたもので)、

^([^長]|長[^さ]).*\n → null

という置換をすれば1回で済むはずです。

以下蛇足かもしれませんが、

私は最初は

  (↓ここが行頭だと思って下さい)
例1|長さ・・・・・・
例2|・・・・・・長さ
例3|・・・長さ・・・
例4|・・長・さ長さ・

これらを間違って消さない様にしなきゃいけない。
(検索文字列がこれらにマッチしちゃいけない。)

例5|・・・・・・・・
例6|・・長・さ・・・
例7|・長・・・・・・
例8|・・・・さ長・・

これらは漏らさずに消さなきゃいけない。
(検索文字列がこれらにマッチしなきゃいけない。)

…ということを考えていました。
で、例6を消しつつ例4を残すあたりがやっかいなわけですが、
このような処理を置換を使ってやるには

・元のテキストに含まれない文字を適当に選ぶ(仮に「@」とします)
・直後が「さ」でない「長」を、「@」に置換。
・「長」を含まない行を削除。
・「@」を「長」に置換。

というような方法がよいのかな、という結論に先ほど(^^;到達しました。

手作業なら(まず元のテキスト中に「@」がないことを確認して)

「長\f[^さ]」→「@\1」
「長$」→「@」
「^[^長]*\n」→「」
「@」→「長」

ってことでいいのかな?
(置換を使った)もっと簡単な方法、あるかなあ?

[ ]
RE:03067 特定文字を含まない行は削除するNo.03069
山紫水明 さん 02/03/17 09:30
 
 きいろいまふらあさん,こんにちは。

》「長さ」で始まる行以外を削除するってことでよいのなら(なんかそんな話にな
》ってるような気がしたもので)、

》^([^長]|長[^さ]).*\n → null

》という置換をすれば1回で済むはずです。

 ですね。いやー,どうも。

》以下蛇足かもしれませんが、

 このこだわり,きいろいまふらあさんの面目躍如(^^;
 どうも,私の粗雑な頭脳では・・・(T_T)

》このような処理を置換を使ってやるには

 置換に限定されているところが注意深い!

》「長\f[^さ]」→「@\1」
》「長$」→「@」
》「^[^長]*\n」→「」
》「@」→「長」

》ってことでいいのかな?

 よさそうですね。

》(置換を使った)もっと簡単な方法、あるかなあ?

「長さ」→ 「@」
「^[^@]+\n」→ 「」
「@」→ 「長さ」

ではだめかなあ?

     では, (^^)/~
                                        山紫水明

[ ]
RE:03067 特定文字を含まない行は削除するNo.03070
Folly さん 02/03/17 20:02
 
>「長さ」で始まる行以外を削除するってことでよいのなら(なんかそんな話にな
>ってるような気がしたもので)、
>^([^長]|長[^さ]).*\n → null
>という置換をすれば1回で済むはずです。
うーむそうか、そういう手があったか。
感心してしまいます。
僕も正規表現を使いこなせるように日々精進したいと思います。

はっきり言って今のところ全く解っていませんので・・・(汗)

[ ]
RE:03069 特定文字を含まない行は削除するNo.03071
きいろいまふらあ さん 02/03/18 23:05
 
> このこだわり,きいろいまふらあさんの面目躍如(^^;
> どうも,私の粗雑な頭脳では・・・(T_T)

いやいや、最近は凝ったマクロを書く気力が衰え、とかく机上の空論にとどまる
ことばかりでして、精力的に実際にマクロをお書きになっている山紫水明さんに
ひたすら感服しておる次第です。(^^;

>「長さ」→ 「@」
>「^[^@]+\n」→ 「」
>「@」→ 「長さ」
>
>ではだめかなあ?

しまった。(^^;
そうですよね。これでよいわけですよね。
ある1文字が含まれていない行の削除なら簡単だと自分で書きつつ、そこに帰着
させるというところに全く頭が働いていませんでした。

精進せねば。

[ ]