免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4068 | 回复: 11
打印 上一主题 下一主题

文本替换的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-02 16:13 |只看该作者 |倒序浏览
3可用积分
有两个文件,一个是替换字符的字典文件X,如下所示:
惣擔
?椷
鸖嬌
?嶈
噴姅
鷆丠
嘦俀
鹔偒
鷽丠
?婌
?孠
塩嬈
一个文件是需要替换的文件Y。内容如下:
惣擔杮-2G    C    OPS塩嬈晹    AD    惣擔杮。。。。。。
需要编写个shell将X文件的每行第一个字符在Y文件中所有出现的地方替换成X文件的第二个字符。谢谢!!!

最佳答案

查看完整内容

看了你的shell,首先取第几个字符不用cut,如果你是bash,可以使用下列方式a='abcd"echo ${a:0:2} ==> abecho $(a:2:2} ==> cd第二,你每取一行就调用sed 修改Y文件,这样会多次扫描Y文件(扫描次数为X行数),效率太低,建议取得第一\第二字符后使用echo "s/${T1}/${T2}/g" >> tempfile的方式,将所有的修改命令保存成临时文件,循环结束后,通过sed -f tempfile Y > Y.new的方式一次性修改Y文件

论坛徽章:
0
2 [报告]
发表于 2008-07-02 16:13 |只看该作者
原帖由 zgl90k 于 2008-7-2 16:43 发表
X文件中的第一个字符都不是空的,可能是显示的原因,我们看到的都是乱码。
还有我写的shell,sed 's/$T1/$T2/g' Y.txt > temp.txt 没有发挥作用,是怎么回事啊?
一个替换都没做。

看了你的shell,首先取第几个字符不用cut,如果你是bash,可以使用下列方式
a='abcd"
echo ${a:0:2}   ==> ab
echo $(a:2:2}   ==> cd

第二,你每取一行就调用sed 修改Y文件,这样会多次扫描Y文件(扫描次数为X行数),效率太低,建议取得第一\第二字符后使用
echo "s/${T1}/${T2}/g" >> tempfile的方式,将所有的修改命令保存成临时文件,循环结束后,通过sed -f tempfile Y > Y.new的方式一次性修改Y文件

论坛徽章:
0
3 [报告]
发表于 2008-07-02 16:19 |只看该作者
乱码,看不清楚内容.如果你的替换没有重复的话,最简单的办法就是把x文件每一行改成如下格式
s/字符1/字符2/g,然后保存成chang.sed,用sed命令调用来修改Y文件
sed -f chang.sed Y > Y.new

论坛徽章:
0
4 [报告]
发表于 2008-07-02 16:21 |只看该作者
X文件是不能更改的。

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
5 [报告]
发表于 2008-07-02 16:29 |只看该作者
“将X文件的每行第一个字符在Y文件中所有出现的地方替换成X文件的第二个字符”?X文件的第二行不是只有一个字吗,怎么替换?

论坛徽章:
0
6 [报告]
发表于 2008-07-02 16:29 |只看该作者
下面是我自己写的shell
#!/bin/sh
while read TEMP
do
      T1=$(echo $TEMP | cut -c 1 )
      T2=$(echo $TEMP | cut -c 2)
      sed 's/$T1/$T2/g' Y.txt > temp.txt
      mv temp.txt MIPB2010.txt
done < X.txt

可是sed 's/$T1/$T2/g' Y.txt > temp.txt 没有发挥作用,是怎么回事啊?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
7 [报告]
发表于 2008-07-02 16:30 |只看该作者

回复 #1 zgl90k 的帖子

try:

  1. sed -f <(sed 's/^\(..\)\(..\).*/s\/\1\/\2\/g/' X) Y
复制代码


原文件:
$ head X Y
==> X <==
惣擔
?椷
鸖嬌
?嶈
噴姅
鷆丠
嘦俀
鹔偒
鷽丠
?婌

==> Y <==
惣擔杮-2G    C    OPS塩嬈晹    AD    惣擔杮。。。。。。

结果:
$ sed -f <(sed 's/^\(..\)\(..\).*/s\/\1\/\2\/g/' X) Y
擔擔杮-2G    C    OPS嬈嬈晹    AD    擔擔杮。。。。。。

[ 本帖最后由 blackold 于 2008-7-2 16:43 编辑 ]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2008-07-02 16:32 |只看该作者

回复 #5 zgl90k 的帖子

应该将MIPB2010.tx 改为Y.txt
另外你没有cut对。

[ 本帖最后由 blackold 于 2008-7-2 16:34 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-07-02 16:34 |只看该作者
X中
?婌
?孠
前面都是空的,转成那个?

论坛徽章:
0
10 [报告]
发表于 2008-07-02 16:40 |只看该作者
原帖由 zgl90k 于 2008-7-2 16:21 发表
X文件是不能更改的。

看贴不看全,都叫你保存成change.sed了,你还不能更改
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP