-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. CefSharp 集成谷歌浏览器详解---(一)环境搭建(没测试过,不知道好不好用)

    https://blog.csdn.net/zpyxman/article/details/78538808

  2. Django1.6 +wsgi 部署到Apache2 的步骤。

    网上很多教程都是关于1.6之前的版本,很多都不适用,经历告诉我们最靠谱的还是官方文档. 一个Demo例子: 以 python shell开发的方式部署没有问题,但当独立部署到Apache2的过程非常艰 ...

  3. 缓存数据库redis、memcached。 MongoDB 资源集锦

    Redis学习资源: 1.Redis学习手册 http://www.cnblogs.com/stephen-liu74/archive/2012/03/14/2349815.html 2.c#连接Re ...

  4. nginx调用php-fpm出错解决方法和nginx配置详解

    装完了nginx和php-5.5,配置好了nginx调用php后,就开始启动php-fpm. 使用下面的命令 复制代码 代码如下: /usr/local/php/sbin/php-fpm 就可以启动了 ...

  5. hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)

    /** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...

  6. 安装 rbbitMQ redis mongo的三个扩展

    #!/bin/bash###install redis extend #########cd /usr/local/srctar fxvz redis-2.2.7.tgzcd redis-2.2.7/ ...

  7. SQL宝典

    SQL Server 数据库的高级操作 (1) 批处理 (2) 变量 (3) 逻辑控制 (4) 函数 (5) 高级查询 */ (1)批处理 将多条SQL语句作为一个整体去编译,生成一个执行计划,然后, ...

  8. ConfigurationSection类使用心得

    ConfigurationSection类主要是方便我们用于扩展自定义webcongfig中的节点信息.我们可以方便的通过以下方式获取[自定义节点对象] [你自定义的对象] config = ([你自 ...

  9. Telnet发送邮件之聊以自慰

    北京的冬天,闲着无聊,得做点什么暖暖脑袋,用windows系统自带工具telnet玩了把邮件发送 准备工作: 1.打开windows系统telnet客户端功能 2.准备两个邮箱帐号(xxx@163.c ...

  10. 设计模式之简单工厂模式(Simply Factory)摘录

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式.但不属于23种GOF设计模式之中的一个.简单工厂模式是由一个工厂对象决定创建出 ...