`
betakoli
  • 浏览: 168723 次
社区版块
存档分类
最新评论

正则表达式的应用

 
阅读更多

需求:

下面一段文本中保存着用户的信息,其中第7个字段是身份证信息,有15位和18位之分,将其中的年份替换成11(15位)或者1111(18位)。环境linux,unix

 

xx|xx|xx|xx|xx|xx|310108900718023|xx|xx|.....
xx|xx|xx|xx|xx|xx|522529198802252219|xx|xx|.....

xx|xx|xx|xx|xx|xx|310108900718023|xx|xx|.....
xx|xx|xx|xx|xx|xx|522529198802252219|xx|xx|..

 

linux环境下,首先想到的方案是:遍历每一行,通过“|”截取,找到身份证后,再通过正则匹配替换。

由于linux中使用正则还需要转义,比如“()”,需要转义成“\(\)”,并没有找到能正确表示"|"的方式,我也尝试了“\|”,但是系统还是认为"|"为特殊字符,于是使用了下面方法:

#!/bin/bash
file='test.txt'
n=0
cat $file | while read line
do
	n=$n+1
	if [ ${#line} == 0 ]
	then
		continue
	else
		i=0
		newline=""
		while((1==1))
		do
			i=$i+1
			split=`echo $line|cut -d "|" -f$i`
			if [ "$split" != "" ]
			then
				if [ $i == 7 ]
				then
					if [ ${#split} == "15" ]
						then
						split=`echo $split | sed 's/\([0-9]\{6\}\)\([0-9]\{2\}\)\([0-9]\{7\}\)/\111\3/g'`
						newline="${newline}${split}|"
					elif  [ ${#split} == "18" ]
						then
						split=`echo $split | sed 's/\([0-9]\{6\}\)\([0-9]\{4\}\)\([0-9]\{8\}\)/\11111\3/g'`
						newline="${newline}${split}|"
					else
						newline="${newline}${split}|"
						continue
					fi
				else
					newline="${newline}${split}|"
					continue
				fi
			else
				newline=`echo ${newline%?}`
				echo newline
				sed "y/${line}/${newline}/" $file    
				break
			fi
		done
	fi
done
echo "success"

后来仔细研究了sed命令,发现linux sed操作有-r,即可扩展的正则表达式,对于"()"不需要进行转义,"\|"也正好能被sed识别,于是解决方式就变简单了:

 

sed -r -i "s/((\w+\|){6})([0-9]{6})([0-9]{2})([0-9]{7})\|/\1\311\5\|/g" test.txt
sed -r -i "s/((\w+\|){6})([0-9]{6})([0-9]{4})([0-9]{8})\|/\1\31111\5\|/g" test.txt

 

实现了方法,但是悲剧的是UNIX系统不支持linux系统很多命令操作。比如sed -r -i都是没有的。而且有些语法不同,所以又回到了原先的方式,去遍历文件再修改,代码如下:

#!/bin/bash
file='test.txt'
newfile='test.bak'
mv $file $newfile
touch $file
text=""
n=0
lastline=`awk '{print NR}' $newfile|tail -n1`
cat $newfile | while read line
do
	n=`expr $n + 1`
	newline=""
	OLD_IFS="$IFS" 
	IFS="|" 
	arr=($line) 
	IFS="$OLD_IFS" 
	i=0
	for s in ${arr[@]}  
	do 
		i=`expr $i + 1`
		len=`expr length $s`
		if [ $i == 7 ]
		then
			if [ $len == "15" ]
			then
				s=`echo $s | sed 's/\([0-9]\{6\}\)\([0-9]\{2\}\)\([0-9]\{7\}\)/\111\3/g'`
				newline="${newline}${s}|"
			elif  [ $len == "18" ]
				then
				s=`echo $s | sed 's/\([0-9]\{6\}\)\([0-9]\{4\}\)\([0-9]\{8\}\)/\11111\3/g'`
				newline="${newline}${s}|"
			else
				newline="${newline}${s}|"
				continue
			fi
		else
			newline="${newline}${s}|"
			continue
		fi
	done 
	newline=`echo ${newline%?}`
	echo $newline >> $file 
done

 

分享到:
评论

相关推荐

    java 正则表达式应用jar包 regex-smart.jar

    总之,`regex-smart.jar`是一个旨在简化Java正则表达式应用的库,它提供了预定义的验证和处理方法,使得开发者能更专注于业务逻辑,而不是复杂的正则表达式编写。通过使用这个库,你可以更加高效地完成字符串的验证...

    Java正则表达式应用总结

    Java正则表达式是编程语言Java中用于处理字符串和文本的强大工具。它允许开发者通过模式匹配来执行复杂的文本分析和操作。在Java中,正则表达式的操作主要涉及两个核心类:`java.util.regex.Matcher`和`java.util....

    易语言正则表达式应用一例

    本压缩包文件“正则表达式应用一例”提供了一个易语言实现的正则表达式应用示例,帮助用户了解和掌握在易语言中如何使用正则表达式。 正则表达式(Regular Expression)是一种强大的文本处理工具,广泛应用于数据...

    vb正则表达式实例(正则表达式测试程序)

    这个“vb正则表达式实例”很可能是为了帮助开发者测试和理解正则表达式的工作原理而设计的一个应用程序。下面将详细探讨正则表达式的基本概念、在VB.NET中的应用以及如何使用它们进行文本匹配。 1. 正则表达式基础 ...

    正则表达式转换工具

    4. **正则表达式在编程中的应用** - 数据验证:在表单提交时,可以使用正则表达式验证输入格式,如邮箱、电话号码等。 - 文件搜索:在代码编辑器中,使用正则表达式快速查找和替换特定模式的文本。 - 数据清洗:...

    Oracle数据库正则表达式

    Oracle 数据库正则表达式应用详解 在 Oracle 数据库中,正则表达式是一种强大的模式匹配工具,可以帮助用户快速搜索、替换和验证数据。从 Oracle 10g 开始,Oracle 内建了符合 IEEE POSIX (Portable Operating ...

    PB实现的正则表达式

    在实际应用中,使用正则表达式可能涉及到以下步骤: 1. 创建正则表达式:定义你要匹配的模式,例如`^[\d]{3}-[\d]{4}$`用于匹配美国电话号码格式。 2. 编译模式:将正则表达式编译成一个可以执行的对象,以提高后续...

    源码(精通正则表达式&实战正则表达式)

    其次,"实战正则表达式两部视频"可能涉及将正则表达式应用于实际项目中的场景,例如: 1. **数据验证**:在表单验证中,使用正则表达式检查邮箱、电话号码、日期格式等。 2. **文本处理**:从大量文本中提取特定...

    正则表达式应用案例共18页.pdf.zip

    在这个名为"正则表达式应用案例共18页.pdf.zip"的压缩包中,我们期待找到一系列关于正则表达式实际运用的案例,这些案例可能涵盖了各种常见和复杂的正则表达式应用场景。 首先,正则表达式的基本构成包括字符集、...

    正则表达式(Deelx版)|正则表达式(Deelx版)支持库

    Deelx版是专门为提高正则表达式性能和功能而设计的一个支持库,适用于各种编程语言和应用场景。 1. **正则表达式基本概念** - **模式匹配**:正则表达式的核心在于模式,它是由特殊字符和普通字符组成的字符串,...

    完整版正则表达式应用一例1.e.rar

    完整版正则表达式应用一例1.e.rar 完整版正则表达式应用一例1.e.rar 完整版正则表达式应用一例1.e.rar 完整版正则表达式应用一例1.e.rar 完整版正则表达式应用一例1.e.rar 完整版正则表达式应用一例1.e.rar

    常用正则表达式HTML,JAVA合集

    在这个“常用正则表达式HTML,JAVA合集”中,我们主要关注的是HTML和Java环境下的正则表达式应用。 1. **HTML中的正则表达式**: 在HTML中,正则表达式通常用于表单验证,例如输入字段(如邮箱、电话号码、手机号码...

    qt使用正则表达式限制lineEdit的输入,对正则表达式进行了封装,可以直接引入,工程编译正常

    接下来,我们探讨如何在lineEdit中应用正则表达式。Qt的lineEdit组件是用于接收用户单行文本输入的控件。通常,我们可以通过重载其`textChanged()`信号或者自定义一个槽函数来监控lineEdit的内容变化,并在其中加入...

    完整版正则表达式应用一例.rar

    完整版正则表达式应用一例.rar 完整版正则表达式应用一例.rar 完整版正则表达式应用一例.rar 完整版正则表达式应用一例.rar 完整版正则表达式应用一例.rar 完整版正则表达式应用一例.rar

    pb 使用正则表达式源码pbregexp

    标题中的“pb 使用正则表达式源码pbregexp”指的是在PowerBuilder(简称pb)环境中,利用名为“pbregexp”的正则表达式组件来实现源代码级别的正则表达式操作。PowerBuilder是一款流行的可视化的、面向对象的软件...

    完整版正则表达式应用一例.e.rar

    完整版正则表达式应用一例.e.rar 完整版正则表达式应用一例.e.rar 完整版正则表达式应用一例.e.rar 完整版正则表达式应用一例.e.rar 完整版正则表达式应用一例.e.rar 完整版正则表达式应用一例.e.rar

    Oracle正则表达式详解(用法+实例)

    #### 四、正则表达式应用实例 下面通过具体的例子来演示如何使用这些正则表达式函数: - **查询以 "1" 开头且以 "60" 结尾的长度为 7 的记录**: ```sql SELECT * FROM fzq WHERE REGEXP_LIKE(value, '^1.{5}60$'...

    VC、VC++,MFC 正则表达式类库

    总的来说,MFC的正则表达式类库提供了一个高效且易于使用的接口,使得VC++开发者能够方便地在Windows应用程序中处理复杂文本模式。了解并熟练掌握这些类和方法,有助于提升文本处理部分的代码质量及效率。

    JAVA正则表达式的应用

    JAVA正则表达式应用:任意输入一串字符串 如何输入exit退出程序;从输入的字符串中判断是否包含手机号码 正则表达式可以使用" +86| 86 1 d{10}" 如果包含请将其在控制台打印出来 否则输出不包含字符串 ...

    正则表达式测试工具C#版(src)

    正则表达式是一种强大的文本...通过深入研究这个C#版的正则表达式测试工具源码,开发者不仅可以巩固正则表达式的基础知识,还可以提升在C#环境中应用正则表达式的能力,同时学习到UI设计和事件处理等方面的实践技巧。

Global site tag (gtag.js) - Google Analytics