Erlang正则解析操作文件
-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正则解析操作文件的更多相关文章
- 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】
一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...
- [Xcode 实际操作]七、文件与数据-(8 )读取和解析Plist文件(属性列表文件)
目录:[Swift]Xcode实际操作 本文将演示如何读取和解析Plist文件,即属性列表文件. 它是用来存储,串行化后的对象的文件. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[New File ...
- 用dom4j解析xml文件并执行增删改查操作
转自:https://www.aliyun.com/jiaocheng/1339446.html xml文件: <?xml version="1.0" encoding=&q ...
- Jsoup系列学习(2)-解析html文件
解析html文件 1.当我们通过发送http请求时,有时候返回结果是一个html格式字符串,你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 使用 Jsoup ...
- CSharpGL(5)解析3DS文件并用CSharpGL渲染
CSharpGL(5)解析3DS文件并用CSharpGL渲染 我曾经写过一个简单的*.3ds文件的解析器,但是只能解析最基本的顶点.索引信息,且此解析器是仿照别人的C++代码改写的,设计的也不好,不方 ...
- java中采用dom4j解析xml文件
一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...
- XML:使用DOM技术解析xML文件中的城市,实现select级联选择
中国的城市xml格式:cities.xml <?xml version="1.0" encoding="utf-8"?> <china> ...
- dom4j如何解析XML文件
最近在 一些对xml文件的操作,下面简单写一个dom4j解析xml文件并将其封装到一个javabean中的例子,只是具有针对性的,不是通用的,仅供参考哦~~ 首先说:dom4j是一个java的XML ...
- Android中的几种解析XML文件的类
Ø DOM解析 优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问XML树中的任何一个节点. 3.DOM解析器的API在使用上也相对比较简单. 缺点:如 ...
随机推荐
- CCNA2.0笔记_ACL
要点: 1.按顺序执行,一旦某条语句匹配,后续语句不再处理. 2.默认ACL 结尾语句是deny any,所以你要记住的是在ACL 里至少要有1 条permit 语句. 3.记得创建了ACL 后要把它 ...
- 初探csrf学习笔记
以下是学习了对CSRF的理解,大家切勿作为标准,如有出错请告之! 严禁转载.不想拿自己刚学到的知识去[误人子弟]之所以写出来是让自己巩固和增加理解,他日对此文有不当之处自会修改. [00x1]csrf ...
- extjs,ComboReturn
package cn.edu.hbcf.common.vo; import java.io.Serializable; public class ComboReturn implements Seri ...
- Swift培训
本篇是Swift内部培训整理的PPT材料,主要内容来源于苹果Swift编程语言官方教程,参考了网上的一些视频课程内容.在教程介绍完之后,本人附带实现了一个项目开发中的常用场景的Demo:基于导航栏和T ...
- shell常用的判断条件
.判断文件夹是否存在 if [ -d /home/q/www ];then echo "true"; else echo "false" ;fi (系统内存在文 ...
- 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建
数据库的创建和sql语句增删改查 1. 载入驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, nam ...
- redis-3.0.6安装
此redis用来缓存跨屏账户绑定信息,安装步骤如下: ssh root@redis.td.com ,注意是root用户 tar -xzvf /nfs/install/softs/redis-3.0.4 ...
- (转)Python爬虫学习笔记(2):Python正则表达式指南
以下内容转自CNBLOG:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 1. 正则表达式基础 1.1. 简单介绍 正则表达式并 ...
- Ajax实现异步上传图片
要求:点击页面浏览按钮后,选择需要上传的图片,页面无刷新,将上传的图片展示出来 开发流程 一:在页面编写表单代码和js代码 <!DOCTYPE html PUBLIC "-//W3C/ ...
- Collection接口与Iterator接口
Collection接口的实现类跟Vector相似.要从实现了Collection接口的类的实例中取出保存在其中的元素对象,必须通过Collection接口的Iterator()方法,返回一个Iter ...