-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. Entity简单使用

    urlEntity: //定义 package com.example.cc.ecustapp.Model; /** * Created by weijiawang on 2016/3/8. */pu ...

  2. 微信小程序2 - 扩展Page参数

    官方默认的Page初始代码为 var option = { /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听页面加载 * */ onLoad: function ...

  3. table与html实例

    *{ margin:0; padding:0; list-style-type:none;/*手动清楚空隙*/ font-size:12px; font-family:"微软雅黑" ...

  4. CNN图像分割总结

    深度学习(三十三)CRF as RNN语义分割-未完待续 http://blog.csdn.net/hjimce/article/details/50888915 Fully Convolutiona ...

  5. 描述JSP和Servlet的区别、共同点、各自应用的范围

    描述JSP和Servlet的区别.共同点.各自应用的范围 解答:JSP在本质上就是SERVLET,但是两者的创建方式不一样.Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Se ...

  6. (转载)【C#4.0】dynamic和var及object

    dynamic a = 10;a = a + 10;Console.WriteLine(a.GetType()); 此段代码会输出 System.Int32,第二行不需要类型转换,因为在运行时识别类型 ...

  7. DMSFrame 之查询表达式用法(一)

    where条件 WhereClip<Adm_User> where = new WhereClip<Adm_User>(q => q.DeleteFlag == fals ...

  8. memset陷阱

    最近在实现差分进化算法的时候,发现数据异常,查了好久,才知道是memset惹的祸! #include <iostream> #include <cstring> using n ...

  9. herf 和 src 的区别

    1.herf 表示超文本引用(hypertext reference),指向网络资源所在位置,建立和当前元素( 锚点)或当前文档(链接)之间的链接,如果我们在文档中添加 <link href=& ...

  10. JDK动态代理具体解释

    首先说一下动态代理和静态代理的差别: 静态代理:是预先写好或由特定工具自己主动生成的代码.再对其编译.在程序执行前.代理类的.class文件就已经存在了. 动态代理:代理是在程序执行时,运用反射机制动 ...