sed 标签

使用sed去除maven项目中xml文件中的注释-支持单行&多行处理 有更新!

  |   0 评论   |   2,072 浏览

场景:
在做一些自动化的脚本处理. 现在要提取Maven工程中的pom.xml文件中的引用jar包的版本定义.
如:

<properties>
        <leo.pdf.version>1.0.2</leo.pdf.version>
</properties>

此时需要准确为别标签 properties内部的内容. 同时还要对里面可能存在的注释进行识别. 以便进行区分过滤.最终得到一个真正的版本定义.
可能遇到的问题:

  • 被注释掉的内容
<!-- <leo.pdf.version>1.0.2</leo.pdf.version> -->
  • 正文部分后面包含注释内容
<leo.pdf.version>1.0.2</leo.pdf.version><!--  跟在右边的注释-->
  • 多行注释
<leo.pdf.version>1.0.2</leo.pdf.version>
<!--  第一行
        第二行
跟在右边的注释
-->
  • 行内多注释注释
<leo.pdf.version>1.0.2</leo.pdf.version><!--  第一个注释 -->  <leo.auth.version>1.0.0</leo.auth.version><!--  第二个注释 -->

虽然这些问题可以规范大家的编码规则 .但是对于一个写自动化处理脚本来说,还是要尽可能的兼容所有的场景才是.

sed 中的正则表达式 有更新!

  |   0 评论   |   3,726 浏览

简单介绍 sed 的正则表达式的使用注意事项.可以看如下的几个case:

一个case:

输入: echo "abcwwwdc456" | gsed -E 's/(abc)([\w]+)(.*456)/\1替换后的字符\3/g'
输出:  abc替换后的字符dc456 
解释: [\w]+只匹配到了所有的`w`.没有匹配后面的`dc`,所以dc没有被替换. 
原因: 实际上字符集是`\`和`w`两者的集合.并不是 **匹配数字和字母下划线** , `\`在 `[ ]`中没有特殊的含义.所以也就无法构建出`\w`

第二个case:

输入: echo "abcwwwdc456" | gsed -E 's/(abc)(\w+)(.*456)/\1替换后的字符\3/g'
输出: abc替换后的字符456
解释: `\w`被识别为了字符集. **数字和字母下划线** , 因此匹配到了w以及后面的dc
原因: 在sed的普通的`s语句`中.是支持如 `\w`,`\b`此类的字符集的.

第三个case:

输入: echo "abcwwwdc456" | ggrep -o -P --color=auto  '(abc)([\w]+)'
输出: abcwwwdc456
解释: `grep`的正则的字符集的定义支持把`\w`放到`[]`中定义新的字符集. 这个更倾向于更常见的正则语法. 写起来也更自然一些
原因: 这个grep使用的是perl语法风格的正则. 因此支持这样处理.