一个文本处理的问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

一个文本处理的问题

#1

帖子 jiandan23 » 2017-01-23 10:53

请教各位,我有这样的一个需求,希望能找到一个比较简单的方法来实现:

在文本中找出符合某个regexp(正则表达式)的字符串,然后将这个字符串通过脚本处理后,再替换到原先的位置。

(尝试过sed,但sed对匹配部分不能调用其它命令来处理。)

例如这样的需求:需要将某段文本中所有以10进制表示的ip,替换成16进制表示的ip。

希望能集思广益,谢谢!
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 一个文本处理的问题

#2

帖子 lilydjwg » 2017-01-23 16:12

Python 的 re.sub 可以传一个函数来生成替换成的字符串。
头像
careone
帖子: 839
注册时间: 2007-12-17 21:41

Re: 一个文本处理的问题

#3

帖子 careone » 2017-02-12 22:24

原理可搜索网贴.示例如下:

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;
方案1输出如下
old IP: 192.168.1.253
new IP: C0:A8:1:FD
方案2输出如下
$ ./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
帖子: 839
注册时间: 2007-12-17 21:41

Re: 一个文本处理的问题

#4

帖子 careone » 2017-02-13 9:54

当然,还可以再简单点:

代码: 全选

echo -n '192.168.1.253' | tr '.' ' ' | awk '{printf("%x.%x.%x.%x", $1,$2,$3,$4)}' | tr 'a-f' 'A-F'
调试过程中,为了显示效果好(增加换行符),需要在 printf 后面加上 \n

代码: 全选

echo -n '192.168.1.253' | tr '.' ' ' | awk '{printf("%x.%x.%x.%x\n", $1,$2,$3,$4)}' | tr 'a-f' 'A-F'
注意:如果某个16进制只有1位数字,可能需要增加判断来补充一个高位数字0,增加到2位数
魁拔不死,天下不宁。
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
回复