请教各位,我有这样的一个需求,希望能找到一个比较简单的方法来实现:
在文本中找出符合某个regexp(正则表达式)的字符串,然后将这个字符串通过脚本处理后,再替换到原先的位置。
(尝试过sed,但sed对匹配部分不能调用其它命令来处理。)
例如这样的需求:需要将某段文本中所有以10进制表示的ip,替换成16进制表示的ip。
希望能集思广益,谢谢!
一个文本处理的问题
- lilydjwg
- 论坛版主
- 帖子: 4249
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 一个文本处理的问题
Python 的 re.sub 可以传一个函数来生成替换成的字符串。
- careone
- 帖子: 839
- 注册时间: 2007-12-17 21:41
Re: 一个文本处理的问题
原理可搜索网贴.示例如下:
1. 使用 Shell 运算进行进制转换 16进制转10进制
http://blog.csdn.net/pansing/article/details/20999987
--------------
2. Linux Shell下进行十进制到十六进制的转换
http://blog.chinaunix.net/uid-20909886-id-3249889.html
---------------
下附简单bash 脚本
方案1输出如下
1. 使用 Shell 运算进行进制转换 16进制转10进制
http://blog.csdn.net/pansing/article/details/20999987
--------------
2. Linux Shell下进行十进制到十六进制的转换
http://blog.chinaunix.net/uid-20909886-id-3249889.html
---------------
下附简单bash 脚本
代码: 全选
#! /bin/bash
## 原理:把原10进制数字,替换点号为空格后,保存为数组;
## 输出时,再把各个数组元素中的空格,替换为冒号 :
declare -a ip hex_ip
STRING="192.168.1.253"
echo " old IP: $STRING"
ip=( `echo $STRING | sed '/\./s// /g'` )
for a in "${ip[@]}"; do
way=2
## optional: 1, 2
if [ $way = 1 ]; then
# ------------
## 方案1:输出为大写字母,如 C0:A8:1:FD
h=`echo "obase=16; $a"|bc`
else
## 方案2:
#利用awk转换为十六进制, 输出为小写字母,如 c0:a8:1:fd
h=`echo $a |awk '{printf("%x", $0)}'`
fi
# ------------
if [ "${#hip[*]}" -ge 1 ]; then
hip=( "${hip[*]}" "$h" )
else hip=( "$h" )
fi
done
NEW_IP=`echo "${hip[*]}" | tr ' ' ':'`
echo " new IP: $NEW_IP"
exit 0;
方案2输出如下old IP: 192.168.1.253
new IP: C0:A8:1:FD
$ ./ip-10-to-16.sh
old IP: 192.168.1.253
new IP: c0:a8:1:fd
魁拔不死,天下不宁。
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
- careone
- 帖子: 839
- 注册时间: 2007-12-17 21:41
Re: 一个文本处理的问题
当然,还可以再简单点:
调试过程中,为了显示效果好(增加换行符),需要在 printf 后面加上 \n
注意:如果某个16进制只有1位数字,可能需要增加判断来补充一个高位数字0,增加到2位数
代码: 全选
echo -n '192.168.1.253' | tr '.' ' ' | awk '{printf("%x.%x.%x.%x", $1,$2,$3,$4)}' | tr 'a-f' 'A-F'
代码: 全选
echo -n '192.168.1.253' | tr '.' ' ' | awk '{printf("%x.%x.%x.%x\n", $1,$2,$3,$4)}' | tr 'a-f' 'A-F'
魁拔不死,天下不宁。
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/