免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3554 | 回复: 9
打印 上一主题 下一主题

[文本处理] awk gsub替换问题 或用更好的办法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-25 11:42 |只看该作者 |倒序浏览
希望把FileMananger.get中引用的文件按规则在路径前面加上版本号。


原文本:
  1. <head>
  2. <script>
  3. FileManager.get('js/js_1222.js',
  4. "/css/v11/css_1.css",
  5. '/css/v8/lpt/css_2.css');TemplateEngine.get('js/js_1222.js', LT.Env.cRoot);
  6. FileManager.get("/css/v8/v8.css");TemplateEngine.get('/root.html', LT.Env.cRoot);TemplateEngine.get('c/resume/main.html',
  7. LT.Env.cRoot);
  8. LT.File.Js.load('/p/p_1.js');
  9. NodeTpl.get('c/resume/main');
  10. NodeTpl.get("c/resume/main");
  11. FileManager.get('/js/js_1.js');
  12. TemplateEngine.get('root.html', LT.Env.cRoot);
  13. TemplateEngine.get("/c/resume/main.html", LT.Env.cRoot);
  14. </script>
  15. </head>
复制代码
对应关系:
js/js_1222.js = 1
/css/v11/css_1.css = 2
/css/v8/lpt/css_2.css = 3
/js/js_1.js = 4
/css/v8/v8.css = 5

实现的结果是:
  1. <head>
  2. <script>
  3. FileManager.get('1/js/js_1222.js',
  4. "/2/css/v11/css_1.css",
  5. '/3/css/v8/lpt/css_2.css');TemplateEngine.get('js/js_1222.js', LT.Env.cRoot);
  6. FileManager.get("/5/css/v8/v8.css");TemplateEngine.get('/root.html', LT.Env.cRoot);TemplateEngine.get('c/resume/main.html',
  7. LT.Env.cRoot);
  8. LT.File.Js.load('/p/p_1.js');
  9. NodeTpl.get('c/resume/main');
  10. NodeTpl.get("c/resume/main");
  11. FileManager.get('/4/js/js_1.js');
  12. TemplateEngine.get('root.html', LT.Env.cRoot);
  13. TemplateEngine.get("/c/resume/main.html", LT.Env.cRoot);
  14. </script>
  15. </head>
复制代码
注意:这个文件js/js_1222.js在FileMananger中和TemplateEngine中各出现过1次,目前只替换FileMananger中出现的这次。

目前是想到用awk匹配到后用 gsub来替换,但似乎写得不正确,没起效果。
目前用的命令,只举替换一个文件的情况。
  1. gawk -F";" -v RS="FileManager.get" 'NR>1{sub("/js/js_1222.js","/1/js/js_1222.js",$1)}' /index.html
复制代码
谢谢。

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
2 [报告]
发表于 2014-07-25 11:49 |只看该作者
  1. sed '/FileManager/s@js/js_1222.js@1/&@;s@/css/v11/css_1.css@/2&@'
复制代码
剩下的自己照猫画虎去吧

论坛徽章:
0
3 [报告]
发表于 2014-07-25 19:36 |只看该作者
回复 2# dn833


    你的方法可以实现很棒,请问 SED不是行处理命令吗?怎么这里可以实现跨行匹配呢?谢谢

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
4 [报告]
发表于 2014-07-26 08:37 |只看该作者
首先呢我这条sed没跨行,其次呢sed也可用Nn跨行

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
5 [报告]
发表于 2014-07-26 13:10 |只看该作者
你需要sed (GNU sed) 4.2.2的-z参数
  -z, --null-data
                 separate lines by NUL characters
  1. sed -z 's#js/js_1222.js#1/&#g;...'
复制代码

论坛徽章:
0
6 [报告]
发表于 2014-07-26 22:04 |只看该作者
回复 4# dn833


原文本中
    FileManager.get('1/js/js_1222.js',
"/2/css/v11/css_1.css",
'/3/css/v8/lpt/css_2.css');TemplateEngine.get('js/js_1222.js', LT.Env.cRoot);

两段红的不是分别在2行中吗?
你用了一句sed,一部分是FileManager.get,一部分是要替换的/css/v11/css_1.css,这不是在二行中吗?为什么是没有跨行呢?真正的跨行是指什么样呢?谢谢。

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
7 [报告]
发表于 2014-07-26 22:11 |只看该作者
回复 6# limaoyuan


    注意sed中的分号,分号前后的s替换没有任何关联

论坛徽章:
0
8 [报告]
发表于 2014-07-26 22:20 |只看该作者
回复 7# dn833


    明白了,那这样可能会产生一个问题就是。

原文本如果是:
<script>
FileManager.get('js/js_1222.js',
"/css/v11/css_1.css",
'/css/v8/lpt/css_2.css');TemplateEngine.get('/css/v11/css_1.css', LT.Env.cRoot);
FileManager.get("/css/v8/v8.css");TemplateEngine.get('/root.html', LT.Env.cRoot);TemplateEngine.get('c/resume/main.html',
LT.Env.cRoot);
FileManager.get('/css/v9/b.css');
LT.File.Js.load('/p/p_1.js');
NodeTpl.get('c/resume/main');
NodeTpl.get("c/resume/main");
FileManager.get('/js/js_1.js');
FileManager.get("/js/js_1.js");
TemplateEngine.get('root.html', LT.Env.cRoot);
TemplateEngine.get("/c/resume/main.html", LT.Env.cRoot);
</script>

我只想修改FileManager这组节点中的指定引用的文档,而不想影响TemplateEngine节点中的值,该如何做到呢?

我试了一下,用之前的命令会同时把TemplateEngine节点中的/css/v11/css_1.css前面也加上了2这个路径,期望是不加。

谢谢。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
9 [报告]
发表于 2014-07-27 16:04 |只看该作者
回复 1# limaoyuan

try this way.... and add more code like as below( in red color)....
$ awk -vRS='\\);|\\(|,' 'F{$0=gensub("(js/js_1222.js)","1/\\1","g",$0);$0=gensub("(/css/v8/v8.css)","/5\\1","g",$0)}{printf $0 RT}RT=="("{F=$NF=="FileManager.get"?1:0}RT==");"{F=0}' FILE
<head>
<script>
FileManager.get('1/js/js_1222.js',
"/css/v11/css_1.css",
'/css/v8/lpt/css_2.css');TemplateEngine.get('js/js_1222.js', LT.Env.cRoot);
FileManager.get("/5/css/v8/v8.css");TemplateEngine.get('/root.html', LT.Env.cRoot);TemplateEngine.get('c/resume/main.html',
LT.Env.cRoot);
LT.File.Js.load('/p/p_1.js');
NodeTpl.get('c/resume/main');
NodeTpl.get("c/resume/main");
FileManager.get('/js/js_1.js');
TemplateEngine.get('root.html', LT.Env.cRoot);
TemplateEngine.get("/c/resume/main.html", LT.Env.cRoot);
</script>
</head>

   

论坛徽章:
0
10 [报告]
发表于 2014-07-27 22:45 |只看该作者
回复 9# jason680


谢谢回复,我这么写了一下,貌似可以,能否帮看下是否有漏洞?谢谢。

    gawk -v RS=";" 'BEGIN{ORS=";"}{if($0 ~ /FileManager\.get/) gsub(/css\/v11\/css_1\.css/,"123/css/v11/css_1.css")}1' /index.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP