« パソコン・情報公開### ヒアドキュメントをパイプ処理の入力とし,ワンライナーにファイル名を引数で渡し,置換でファイルの書き換え | トップページ | 告発に至る経緯・奥能登の蛸島事件と,弁護士列車編#### 秋田県に1億6480万円の賠償を命じた弁護士刺殺事件と蛸島事件との共通性,落合洋司弁護士(東京弁護士会)の反応 »

2021年2月 9日 (火)

パソコン・情報公開### RubyのARGFオブジェクトを使って,ディレクトリ内のzshグロブにマッチした全てのテキストファイルを正規表現で置換

:CATEGORIES: Ruby #正規表現

cat << 'EOS' | ruby -i -e 'puts ARGF.read.gsub(/(.*cond = http(.*\n)+?[ ]*fi\n)/, "\\1#{STDIN.read}")' test.sh if [ $cond = https ];then port=443 fi EOS
  • Rubyやsedで複数行の文章を任意の箇所に挿入する - grep Tips * https://www.greptips.com/posts/1170/

     ARGVはよく使いますが,ARGFというのは初めて見たように思います。もう15年以上はRubyを使っていると思いますが,今日まで知らなかったことが驚きです。上記のページのワンライナーで知りました。

     ARGFを調べたところ,引数を全てファイルとみなし連結して処理するような説明でしたが,Shiftで一つずつ取り出すという情報もあり,試したところ,ファイルグロブ(Windowsのワイルドカードと似たもの)で指定したファイルを1つずつ読み込んで処理をしているようでした。

     この理屈だとより強力なZshグロブで,ディレクトリ内のファイルを一括で置換できるのではと考え,やってみたところうまく行ったようです。これまではfindコマンドにexecオプションとsedの組み合わせなどの処理をしてきたように思いますが,より簡単に出来そうな感じです。

     次のようにやってみました。

|sh| (py37_env) ➜ ruby-2020-02-09 date > x.txt (py37_env) ➜ ruby-2020-02-09 cat x.txt 2021年 2月 9日 火曜日 15:50:04 JST (py37_env) ➜ ruby-2020-02-09 cp x.txt dir*/ (py37_env) ➜ ruby-2020-02-09 cp x.txt dir*/dir*/dir*/ (py37_env) ➜ ruby-2020-02-09 ls /x.txt dir1/dir2/dir3/x.txt dir1/x.txt x.txt (py37_env) ➜ ruby-2020-02-09 cat */x.txt 2021年 2月 9日 火曜日 15:50:04 JST 2021年 2月 9日 火曜日 15:50:04 JST 2021年 2月 9日 火曜日 15:50:04 JST (py37_env) ➜ ruby-2020-02-09 echo "追加のテスト" | ruby -i -e 'puts ARGF.read.gsub(/(^.+$)/, "\1 -> #{STDIN.read}")' /.txt (py37_env) ➜ ruby-2020-02-09 cat **/x.tx 2021年 2月 9日 火曜日 15:50:04 JST -> 追加のテスト

2021年 2月 9日 火曜日 15:50:04 JST -> 追加のテスト

2021年 2月 9日 火曜日 15:50:04 JST -> 追加のテスト

(py37_env) ➜ ruby-2020-02-09 readlink -f **/x.txt /home/a66/w/ruby-2020-02-09/dir1/dir2/dir3/x.txt /home/a66/w/ruby-2020-02-09/dir1/x.txt /home/a66/w/ruby-2020-02-09/x.txt ||<

 処理を単純にするためechoコマンドを使いましたが,次のようにcatコマンドを使えば,テキストファイルの内容を追加することが簡単に出来ます。

|sh| (py37_env) ➜ ruby-2020-02-09 cat m | ruby -i -e 'puts ARGF.read.gsub(/(^.+$)/, "\1 -> #{STDIN.read}")' /.txt (py37_env) ➜ ruby-2020-02-09 cat */x.txt 2021年 2月 9日 火曜日 15:50:04 JST -> 追加のテスト -> /home/a66/w/ruby-2020-02-09/dir1/dir2/dir3/x.txt /home/a66/w/ruby-2020-02-09/dir1/x.txt /home/a66/w/ruby-2020-02-09/x.txt

2021年 2月 9日 火曜日 15:50:04 JST -> 追加のテスト -> /home/a66/w/ruby-2020-02-09/dir1/dir2/dir3/x.txt /home/a66/w/ruby-2020-02-09/dir1/x.txt /home/a66/w/ruby-2020-02-09/x.txt

2021年 2月 9日 火曜日 15:50:04 JST -> 追加のテスト -> /home/a66/w/ruby-2020-02-09/dir1/dir2/dir3/x.txt /home/a66/w/ruby-2020-02-09/dir1/x.txt /home/a66/w/ruby-2020-02-09/x.txt ||<

|

« パソコン・情報公開### ヒアドキュメントをパイプ処理の入力とし,ワンライナーにファイル名を引数で渡し,置換でファイルの書き換え | トップページ | 告発に至る経緯・奥能登の蛸島事件と,弁護士列車編#### 秋田県に1億6480万円の賠償を命じた弁護士刺殺事件と蛸島事件との共通性,落合洋司弁護士(東京弁護士会)の反応 »