shell脚本中怎么把文件中每一行最后一字符串替换掉我想要的格式

例如我有一个test.sql文件

 geoadd key 24.9830, 106.2090, '昌平霍营村'
geoadd key 24.9830, 106.2091, '昌平霍营村'
geoadd key 24.9830, 106.2092, '昌平霍营村'
geoadd key 24.9830, 106.2093, '昌平霍营村'

替换成下面的这种格式,让最后一个字符串按照需要格式自增

 geoadd key 24.9830, 106.2090, '昌平霍营村$1'
geoadd key 24.9830, 106.2091, '昌平霍营村$2'
geoadd key 24.9830, 106.2092, '昌平霍营村$3'
geoadd key 24.9830, 106.2093, '昌平霍营村$4'

实在是想不出来改怎么实现这个功能了,只有2C币了,还请大神能够指点一二。谢谢了!

3个回答

用awk替换,假设你的文本是存在test.txt,用-v传入一个变量seq,然后匹配关键字,匹配到后seq+1,最后把输出重定向到文件就可以了

 ~$ awk -v seq=1 '{sub(/昌平霍营村/,"昌平霍营村$"seq++)} {print $0}' test.txt 
geoadd key 24.9830, 106.2090, '昌平霍营村$1'
geoadd key 24.9830, 106.2091, '昌平霍营村$2'
geoadd key 24.9830, 106.2092, '昌平霍营村$3'
geoadd key 24.9830, 106.2093, '昌平霍营村$4'

dead911
呆的久 回复sias1991: 见回复
3 年多之前 回复
sias1991
mt172970621 昌平霍营村 也是个变量;像海淀西三旗村,朝阳村等等 我该怎么实现呢?
3 年多之前 回复

如果你只是按照最后一个字段,进行归类并+1操作的话,用如下的awk命令。

~$awk '{sub(/'\''$/,"$"a[$(NF)]++"'\''")} {print $0}' test.sql
geoadd key 24.9830, 106.2090, '昌平霍营村$0'
geoadd key 24.9283, 106.2938, '海定西三旗村$0'
geoadd key 24.9830, 106.2091, '昌平霍营村$1'
geoadd key 24.9830, 106.2092, '昌平霍营村$2'
geoadd key 24.9283, 106.2938, '海定西三旗村$1'
geoadd key 24.9830, 106.2093, '昌平霍营村$3'
geoadd key 24.9283, 106.2938, '海定西三旗村$2'

sias1991
mt172970621 回复sias1991: 地址内容变化了,发现只有最后一个按照我需要的格式修改了,其他都没有改变
3 年多之前 回复
sias1991
mt172970621 我发现换了数据格式后,命令不起作用了。
3 年多之前 回复
sias1991
mt172970621 谢谢了。我把你的命令执行后重定向到一个新的文件,总算可以解决我的问题。感谢!
3 年多之前 回复
dead911
呆的久 必须确保最后一个字段是以单引号结尾~
3 年多之前 回复

好奇怪我周末试的是没有问题,但是今天试了下发现改不了了,数据格式一样的,就是数据内容变了

sias1991
mt172970621 回复呆的久: 这个就好用。我确实是直接从oracle导出的sql文件,也做了转码,没搞明白具体哪里出的问题。以后再细看下。谢谢大神!
3 年多之前 回复
dead911
呆的久 回复sias1991: awk -F"'" '{if(NF==3) { print $1"'\''"$2"$"a[$(NF-1)]++"'\''"} else {print $0}}' test.sql 哎,肯定是文件编码的问题,你要么试试这个.这个会匹配两个单引号,在后一个单引号前插入index
3 年多之前 回复
sias1991
mt172970621 回复呆的久: unix2dos和dos2unix命令2个都试过了,就是不好使。不知道问题出在哪里了。
3 年多之前 回复
dead911
呆的久 大兄弟啊,你是不是用windows编辑过test.sql了?windows的换行符在linux下解析会出问题的,我估计失败的几行后面有个^M的隐藏字符.你看看你系统上有没有dos2unix的命令,有的话做一把装换. dos2unix test.sql,然后再awk
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐