質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

10回答

1127閲覧

お勧め文字列置換スクリプト言語を習得するにあたって

rockn26

総合スコア16

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

2グッド

2クリップ

投稿2019/06/29 06:33

編集2019/06/30 01:26

正規表現を使用して、文字列置換を行いたいと考えています。

当方、最近の言語はあまり知らないため、将来を見据えこれからも使えるお勧め文字列置換スクリプト言語がありましたら、教えてくださいませ。
ちなみにプログラムだけはベテランの方に聞くとsed,awk等で出来ると言われましたが・・・、どうせ覚えるならモダンな言語がいいと思いまして質問させて頂きました。

捕捉:環境 windows10
Unixライクな環境は構築可能だが、出来るだけやりたくない。
やりたい事は下記の文字列置換を以下にシンブルにできる方法を模索中。

例:
元文字列
あいうえお、男、0120-1234-1111、
かきくけこ、男、0120-1234-2222、
さしすせそ、女、0120-1234-3333、
↓置換後
NO.1, 0120-1234-1111, MR.あいうえお
NO.2, 0120-1234-2222, MR.かきくけこ
NO.3, 0120-1234-3333, Mrs.さしすせそ

donky-jr, DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2019/06/29 07:10 編集

質問の内容とは関係ないけど「年配の人」ではなく「ベテランの人」など、知識のある方へリスペクトを持って接してくださいね…。 あと、sed, awk は今でも普通に使えますので、モダンである必要は特に感じられません。 それよりも自分が使いやすい言語を体当たりで調べてみてはどうでしょうか。
rockn26

2019/07/13 15:38

年配の人に代わりは無いですからね。 ただ、若くて、sed,awkを使いこなす方に関してはリスペクトはします。
guest

回答10

0

大概のスクリプト言語は正規表現を使えるようになっていますから、正規表現を使って処理をする分にはどの言語を選んでも大差はありません。
正規表現の機能を使うにあたり、各言語毎に文法等が異なりますから、それらを含めてしっくり来るものを使えばいいのではないでしょうか。
(結局は、一度は使ってみた方がいいと思います)

ただ、業務等で使うとなると、若干状況が変わることもあります。元より、モダンなスクリプト言語を使える環境であれば、選択肢が広がりますが、そうでない場合(しかも、Unix/Linuxの環境でということになると)、使えるスクリプト言語も限られます。そのような環境の場合でもsedawkperlはインストールされていることが多いので、その中から選ぶことになるでしょう。
(自由に言語をインストールができない環境であれば、その中から選ぶしかないです)

どの言語を選ぶのは自由ですが、どこでも使えるようなものを選ぶとなると、モダンな言語より、sedawkになることが多いと思います。
(CentOSはperlの代わりにpython2系が入ってるらしいですが。それとWindowsだと、どの道どれもインストールする必要がありますが)

投稿2019/06/29 07:39

archiver

総合スコア1557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rockn26

2019/06/30 01:22

今風の言語だと、簡単に実装できるのかと思ってましたが。 sed、awk、perlって古いというイメージがあって、避けてましたが、 覚えて損は無さそうですね。
ku__ra__ge

2019/07/03 05:55

モダンな言語のほうが目的とすることを簡単に実装できることが多いのは否定しませんが、sedやawkは利用用途がテキスト操作に特化されているという特徴によってそれ以上に簡単です。 最新鋭の十徳ナイフを使うより、古臭く洗練されていない皮むき器を使ったほうが皮をむく分には簡単ってわけです。
rockn26

2019/07/13 15:12

返答遅くなりすいません。アドバイスありがとうございます。 当方ベースはC言語ですので、もう少し古臭い皮むき器で頑張るのも良いかなと思います。 pythonは覚えても損は無いかなと思いますが
guest

0

参考までに、「モダンな言語」のPythonで書いてみました。

python

1import sys 2 3honor = {"男":"MR", "女":"Mrs"} 4for i, line in enumerate(sys.stdin, start=1): 5 name, sex, tel, *_ = line.split("、") 6 print(f"NO.{i}, {tel}, {honor[sex]}.{name}") 7 8# python script_name.py < input.txt > output.txtとかで

同じようなことは大抵のスクリプト言語でできると思います。Pythonでやると、コードの見た目は可もなく不可もなくという感じで、書くのはすごく簡単なので、私はよく慣れてるPythonでやります。

csvモジュールでも書いてみた

python

1import sys 2import csv 3 4honor = {"男":"MR", "女":"Mrs"} 5for i, d in enumerate(csv.DictReader( 6 sys.stdin, ["name", "sex", "tel", "*"], delimiter="、"), start=1): 7 print(f"NO.{i}, {d['tel']}, {honor[d['sex']]}.{d['name']}")

大差ないような気も・・・

投稿2019/06/30 06:20

編集2019/06/30 07:30
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/30 06:24

まぁ、正規表現は使わんよねぇ^^;
hayataka2049

2019/06/30 07:32

区切り文字があるならそれで区切るだけですからね
ai_2013_dev

2019/07/02 12:54

やはり、pythonの方がシンプルで良いですね。
rockn26

2019/07/13 15:25

返答遅くなりすいません。アドバイス&参考例までありがとうございます。 当方ベースはC言語ですので、 拝見したところ、モダンな言語は文法が違って、それはそれで覚えないといけないですね。 pythonも勉強したいと思います。
guest

0

やりたいことを見る限り、正規表現を使用するケースではないです

スクリプトを使用した「正規表現による置換」でもっとも手軽なのは「sed,awk」です。
アドバイスに従えば良い。
(というか、何んでアドバイスに従わないのか不明。。。)

「モダンな言語」を使用したいのであれば先に「モダンな言語」を決め打ちしてしまえば良いです。インプット/アウトプットの例を見る限りナンの言語を使用しても再構築可能です。

投稿2019/06/29 08:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rockn26

2019/06/30 01:23

モダンな言語だと、簡単に実装できるのかと思ってましたが。 sed、awk、って古いというイメージがあって、避けてました。
退会済みユーザー

退会済みユーザー

2019/06/30 02:41

質問に対して適切にアドバイスまでもらっているのに試さなかったんでしょ? そういう人にはどんな簡単なモノでも簡単では無いです。 簡単と言えるのは「一歩目を簡単に踏め出せる人」だけです。
BeatStar

2019/07/01 01:49

横からすみません。 te2jiさんのご意見に賛成ですね。特に「質問に対して適切に~」の文章。 私もそう思いますし。
rockn26

2019/07/13 15:20

返答遅くなりすいません。アドバイスありがとうございます。 そうですね、簡単で無いのはわかりました。 おっしゃる通りに暇な時にでも「一歩目を簡単に踏みだせる人」を目指してやってみますね
guest

0

perl以後の言語でしたら、おそらく文字列に関するなんらかのサポートがあります。

選考するためのポイントとしては

  • 対象文字列(ファイル)がUTF-8で与えられるか?

sjisのまま扱えるかまたは適切なエンコーディングに変換できる言語である必要があります。

  • 置換速度を考慮する必要があるか?

もし、だいたい1秒以内に置換完了させる必要があるのならば
スクリプト言語は不向きなのでgo等のコンパイル言語を考えます。

  • 置換を実行するマシンの環境はどうなっているか?

極端な例ですが、windowsマシンに対してsed/awkは不向きです。
また、既にインストールされている言語があるのならばそれを用いた方がよいこともあります。

これらを考慮しながらruby python php perl js go c# powershellあたりのマニュアル読むなりして
実現したい動作を実現できるか考えるといいんじゃないですかね


Ruby(ワンライナー)

shell

1ruby -Ku -ple "f=$_.split('、');$_=%(NO.#{i||=0;i+=1}, #{f[2]}, #{{'男'=>'MR.','女'=>'Mrs.'}[f[1]]}#{f[0]})" < input.txt

投稿2019/06/29 07:38

編集2019/07/01 04:46
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rockn26

2019/06/30 01:15

go は知りませんでした。 js,powershell でも可能なんですね。
asm

2019/06/30 01:48

goはマルチプラットフォームかつ高速なコンパイル言語なので 処理速度優先で実行ファイルを配布することに問題がない場合に選択します。 反面、スクリプト言語よりは面倒くさいです。 jsは慣れている人ならばnode.jsやWSHまたはnashornで動作させることが可能 ・・・ですが、IOが特殊な上にUTF-8以外の文字コードだと面倒だったはずです。 powershellはWindowsでexeの配布ができない場合で、実行する環境にソフトをインストールできない場合に選択肢にあがります。 Win7以降ならば標準搭載という点が魅力です。 正規表現があり、.net Frameworkを呼び出す事やC#で記述した処理を実行する事などができ意外と役立ちます。
rockn26

2019/07/13 15:06

返答ありがとうございます。返答遅くなりすいません。 当方ベースはC言語なので、文法的にC#が使いやすかなと思います。
guest

0

Windows 10ということを考えれば、「Unix的な環境」や個別のインストールなしに使えるスクリプト言語はほぼありません

となれば、優先したいことによって取るべき道が変わってきます。

  • 何もインストールしないことを優先したい→WSHやPowerShellを使う(ただし、他言語より資料が少ない、また使える幅も限られるなどの制約はあります)、あるいはすでに環境にあるツールを使う
  • 将来を見据えこれからも使える言語を学ぶことを優先する→先に言語を選定して、その環境を構築する

投稿2019/07/01 02:04

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/07/08 00:51

PowerShell の資料の量と使える幅に関しては全く問題にならないと思いますが。 ほぼ何でもできます。
rockn26

2019/07/13 15:28

返答遅くなりすいません。アドバイスありがとうございます。 PowerShellも使えるという事が最近わかりました。 当方ベースはC言語ですので、そうなると変にモダンな言語を無理に覚えるより、 Unixベースでもう少し頑張ってみようかと思います。
guest

0

ベストアンサー

何を以て「モダン」と定義するのか知りませんが、私の結論を言わせてもらうなら、質問の案件に関する限りperlが第1候補ですね。次点がawkです。

「正規表現」自体は多くの言語で利用することができます。しかし正規表現だけでやりたいことをすべてカバーできることは稀です。質問のケースにおいても、行番号での置換などは正規表現だけではカバーできません。テキストの加工に関しては、豊富な機能と柔軟なコーディングスタイルをサポートし、限りなくsedに近いたかだか数文字の極少ワンライナーから数千行におよぶ本格的なツール構築にまで対応できる点で、perlを超えるものは見当たらないですね。古いとか見にくいとか言っている人たちがいますが、そんな批判は当たりません。

試しにスクリプトを書いてみました。

sed

# test.sed s/([^、]*、)男/\1MR./ s/([^、]*、)女/\1Mrs./ s/([0-9]*)\t(.*?)、(.*?)、(.*?)、/NO.\1,\3\2,\4/

sedでは変数をスクリプトの中で自由に使うことができないので工夫が必要になります。とくに行番号の取り込みはsedだけでは難しく、他のツールの助けを借りることになるでしょう。この点で少なくとも当案件に関してはsedは手軽とは言いにくいように思います。

対象データがutf-8のテキストとしてinput.txtに格納されていると仮定すれば、次のような感じになるでしょう。行番号の付加にnlの助けを借りています。

nl input.txt | sed -r -f test.sed > output.txt

awk

# test.awk match($0, /(.*?)、(.*?)、(.*?)、/, a){ printf("NO.%d,%s,%s%s\n", NR, a[3], ( a[2]=="男")?"MR.":"Mrs.", a[1]); }

sed版に寄せて、全体を正規表現で処理するように書いてみました。しかし、私が実際にやるとすれば、をフィールドセパレータとしてまず文字列を分割してから、それぞれを処理する流れにすると思います。
変数と三項演算子が使えるので、他のツールを援用する必要もなく、sedの回りくどさがありません。

awk -f test.awk input.txt > output.txt

perl

use strict; use warnings; use utf8; binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; while(<STDIN>){ /(.*?)、(.*?)、(.*?)、/ and printf("NO.%d,%s,%s%s\n", $., $3, ($2 eq '男')?'MR.':'Mrs.', $1); }

他にいろいろやりようはあると思いますが、前掲のスクリプトと比較しやすいであろう形で書いてみました。
この範囲ではawkに比べるとやや冗長な感じが出てしまいます。しかし、これ以上処理の内容が複雑化するならばperlのありがたみを噛みしめることになるでしょう。

perl test.pl < input.txt > output.txt

投稿2019/06/29 23:35

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rockn26

2019/06/30 02:06

処理内容まで、ありがとうございます。 全部試してみたところ、全部可能であることがわかりました。 sedは使うことはありますが、確かにsedだけでやるのは厳しいですね。 awkが一番シンプルに見えますね。 perlは文法が分かりにくいですが、おっしゃる通り覚えて損は無さそうですね。 awkもperlも行番号出力がわかりませんが、そこは調べてみます。 perlを前向きに検討したいと思います。
rockn26

2019/07/13 15:51

sed, awk、perlが 何故良いのか具体的に回答して頂いた点を考慮しベストアンサーにさせて頂きます。 ありがとうございました。
guest

0

文字列を置換するだけであれば、エディターのマクロでもできます。

// // 秀丸マクロ // Init: // データファイルハンドルを取得する #HWND = hidemaruhandle(0); newfile; // 結果保存先 #HWND_NEW = hidemaruhandle(0); setactivehidemaru #HWND; // データファイルに戻る // #c1 = 0; #c2 = 256; #l1 = 1; #l2 = 1; Main: while(1) { $pok = gettext2(#c1, #l1, #c2, #l2, 0); if (strlen($pok) == 0) break; setactivehidemaru #HWND_NEW; $no = str(#l1); call Split $pok, "、", 0; // call Split $pok, ",", 0; // message str(##return); if (##return > 2) { $name = $Spl[0]; $sex = $Spl[1]; $tel = $Spl[2]; if ($sex == "男") { $sex = "MR."; } else { $sex = "Mrs."; } insert "No." + $no + "," + $tel + "," + $sex + $name+ "\n"; } setactivehidemaru #HWND; // 次の行へ #l1 = #l1 + 1; #l2 = #l1; } End: endmacro; // 秀丸マクロには、Split系の関数が存在しないので自作する Split: $$str = $$1; $$fnd = $$2; ##end = ##3; ##fnd_len = strlen($$fnd); ##i = 0; ##cnt = 0; if (strstr($$str,$$fnd) > -1){ while( ##i < strlen($$str) ) { if (midstr($$str, ##i, ##fnd_len) == $$fnd) { $Spl[##cnt] = midstr($$str, ##start, ##i - ##start); ##start = ##i + ##fnd_len; ##cnt = ##cnt + 1; } ##i = ##i + 1; } $$estr = midstr($$str, ##start); if (strlen($$estr) == 0) { if (##end) { $Spl[##cnt] = $$estr; } } else { $Spl[##cnt] = $$estr; ##cnt = ##cnt + 1; } } return ##cnt;

実際に実装してみて、pythonやrubyの方が簡単にできますね。

投稿2019/07/02 12:40

編集2019/07/02 12:44
ai_2013_dev

総合スコア338

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rockn26

2019/07/13 15:31

返答遅くなりすいません。アドバイス&参考例までありがとうございます。 秀丸マクロは今まで使ったことが無かったですが、出来るんですね。 言語は何になるんですかね?秀丸マクロ言語ですか?
ai_2013_dev

2019/07/14 13:53

>言語は何になるんですかね?秀丸マクロ言語ですか? 秀丸マクロです。
guest

0

awkの奥の深さ、sedのお手軽さに、打ちひしがれる日が必ずくるのに、真っ当な技術者であればあるほどに。

投稿2019/06/29 09:52

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rockn26

2019/06/30 01:23

モダンな言語だと、簡単に実装できるのかと思ってましたが。 sed、awk、って古いというイメージがあって、避けてました。
guest

0

perl . ruby , python で実装可能です。
linux をインストールしなくてもそれぞれ単体で
言語をwindowsマシンにインストールできます。
VS CODE をインストールして
正規表現のプラグインを インストールして
コーディングすれば実装は30分もあればできるでしょう

投稿2019/07/08 00:37

nanami12

総合スコア1015

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rockn26

2019/07/13 15:41 編集

返答遅くなりすいません。アドバイスありがとうございます。 当方、C言語ベースなプログラマーなので、 perl, pythonは文法に関しては勉強が必要ですね。
guest

0

Python, Ruby, Perl, PHP...

投稿2019/06/29 06:43

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rockn26

2019/06/30 01:13

phpでも可能なんですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問