-module(tool).
%% ====================================================================
%% API functions
%% ====================================================================
-export([modify_hostname/0,modify_ip/0]).
modify_hostname() ->
 {ok,HostName} = inet:gethostname(),
 %通过截取和加入。得到priv所在的文件夹
 EbinDir = filename:dirname(code:which(?MODULE)),
 ProjectDir = string:sub_string(EbinDir,1,length(EbinDir)-4),
 PrivDir = ProjectDir ++ "priv/",
 {ok,Files} = file:list_dir(PrivDir),
 lists:foreach(fun(A)-> replace(PrivDir++A,HostName) end,Files),
 io:format("modify hostname successfully!~n").
replace(FileName,HostName) ->
 {ok,Content} = file:read_file(FileName),
 RawString = binary_to_list(Content),
%%  以非贪婪模式匹配@开头不包括}的随意字符同一时候以逗号结束的特征串
 {ok,MP1} = re:compile("@[^}]*,",[ungreedy]),
 ResultString1 = re:replace(RawString,MP1,"@"++HostName++",",[{return,list},global]),
%%  以非贪婪模式匹配@开头不包括}和逗号的随意字符同一时候以]}结束的特征串
 {ok,MP2} = re:compile("@[^},]*]}",[ungreedy]),
 ResultString2 = re:replace(ResultString1,MP2,"@"++HostName++"]},",[{return,list},global]),
%%  以非贪婪模式匹配@开头不包括}和逗号的随意字符同一时候以]}结束的特征串
 {ok,MP3} = re:compile("@[^,]*}]",[ungreedy]),
 ResultString3 = re:replace(ResultString2,MP3,"@"++HostName++"}]",[{return,list},global]),
    file:write_file(FileName, list_to_binary(ResultString3)).

modify_ip() ->
 {ok,Iflist} = inet:getif(),
 {A,B,C,D} = element(1,lists:nth(2,Iflist)),
 Ebin = filename:dirname(code:which(?MODULE)),
%%  得到nodefinder.app所在的路径
 ProjectDir = string:sub_string(Ebin,1,length(Ebin)-17),
 AppDir = ProjectDir ++ "Res/ebin/nodefinder.app",
 {ok,Content} = file:read_file(AppDir),
 LocalIp = "{"++integer_to_list(A)++","++integer_to_list(B)++","++integer_to_list(C)++","++integer_to_list(D)++"}",
 RawString = binary_to_list(Content),
%%  通过正則表達式进行匹配后。然后替换成本机Ip
 {ok,MP} = re:compile("{[0-9]+,[0-9]+,[0-9]+,[0-9]+}"),
 ResultString = re:replace(RawString, MP, LocalIp,[{return,list}]),
 file:write_file(AppDir,list_to_binary(ResultString)),
 io:format("modify ip successfully!~n").

解析的文件例如以下:

总结:(1)学习通过filename:dirname(code:which(?MOUDLE))获取文件所在的绝对路径。

              (2)erlang的file:get_cwd(),file:list_dir("."),默认的是工作文件夹或是c:cd(...)后进入的文件夹,假设没有设定erlang的工作文件夹。则“.”表示当前文件夹;

               (3)学习erlang中正則表達式的用法

Erlang正则解析操作文件的更多相关文章

  1. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  2. [Xcode 实际操作]七、文件与数据-(8 )读取和解析Plist文件(属性列表文件)

    目录:[Swift]Xcode实际操作 本文将演示如何读取和解析Plist文件,即属性列表文件. 它是用来存储,串行化后的对象的文件. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[New File ...

  3. 用dom4j解析xml文件并执行增删改查操作

    转自:https://www.aliyun.com/jiaocheng/1339446.html xml文件: <?xml version="1.0" encoding=&q ...

  4. Jsoup系列学习(2)-解析html文件

    解析html文件 1.当我们通过发送http请求时,有时候返回结果是一个html格式字符串,你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 使用 Jsoup ...

  5. CSharpGL(5)解析3DS文件并用CSharpGL渲染

    CSharpGL(5)解析3DS文件并用CSharpGL渲染 我曾经写过一个简单的*.3ds文件的解析器,但是只能解析最基本的顶点.索引信息,且此解析器是仿照别人的C++代码改写的,设计的也不好,不方 ...

  6. java中采用dom4j解析xml文件

    一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...

  7. XML:使用DOM技术解析xML文件中的城市,实现select级联选择

    中国的城市xml格式:cities.xml <?xml version="1.0" encoding="utf-8"?> <china> ...

  8. dom4j如何解析XML文件

    最近在 一些对xml文件的操作,下面简单写一个dom4j解析xml文件并将其封装到一个javabean中的例子,只是具有针对性的,不是通用的,仅供参考哦~~ 首先说:dom4j是一个java的XML ...

  9. Android中的几种解析XML文件的类

    Ø DOM解析 优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问XML树中的任何一个节点. 3.DOM解析器的API在使用上也相对比较简单. 缺点:如 ...

随机推荐

  1. C# MessageBox 消息对话框

    在程序中,我们经常使用消息对话框给用户一定的信息提示,如在操作过程中遇到错误或程序异常,经常会使用这种方式给用于以提示.在C#中,MessageBox消息对话框位于System.Windows.For ...

  2. 关于EasyUI的Layout总结

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1.layout以html标签方式建立的 <div id="content" region="center&q ...

  3. 小型web服务器thttpd的学习总结(上)

    1.软件的主要架构 软件的文件布局比较清晰,主要分为6个模块,主模块是thttpd.c文件,这个文件中包含了web server的主要逻辑,并调用了其他模块的函数.其他的5个模块都是单一的功能模块,之 ...

  4. C++ 类模板四(typename关键字)

  5. 卡友pos机使用流程

    Q: pos机正常使用步骤 A: 1. 按开机键开机2. 输入“01”进行签到3. 系统提示输入密码,密码为“0000”4. 系统提示“请刷卡”,可正常刷卡消费首次使用请务必登陆商户后台核对结算收款账 ...

  6. map实现

    /*PLSQL实现Map*/ --建立序列create sequence seq_map_param_id ;--建立参数表create table map_param(id number prima ...

  7. Amazon【EC2】如何启动一个新的EC2实例

    1.1 控制台可直接搜索ec2 1.2 创建实例 aws没有新建实例这个说法,新建就是启动实例 1.3 选择镜像 在搜索框中搜索自己想要的镜像.这里有收费的也有免费的 1.4 选择实例类型 选择自己想 ...

  8. [越狱开发] theOpenDev配置与搭建碰到的问题

    CodeSign error: code signing is required for product type 'Dynamic Library' in SDK 'iOS 6.1' 如何解决?

  9. Java transient关键字使用小记(转)

    哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transi ...

  10. CGContextRef用法

    本文转载至 http://blog.csdn.net/perfect_promise/article/details/7660220 quartz 是主要的描画接口,支持基于路径的描画. 抗锯齿渲染. ...