如何替换文本中某段的数据??

发表于:2007-05-26来源:作者:点击数: 标签:
[size=18:6f41fc64fa][color=blue:6f41fc64fa]i sql 导出一文本格式如下: C900566|2|456566|5062011082099|28.00 C900566|2|456566|5062011082099|48.00 C900566|2|456566|5062011082099|25.00 C900566|2|456566|5062011082099|62.00 ........ 如何将每行的

[size=18:6f41fc64fa][color=blue:6f41fc64fa]isql导出一文本 格式如下:
C900566 |  2 |  456566 |  5062011082099 |  28.00
C900566 |  2 |  456566 |  5062011082099 |  48.00
C900566 |  2 |  456566 |  5062011082099 |  25.00
C900566 |  2 |  456566 |  5062011082099 |  62.00
........
如何 将每行的第四个字段中的5062 替换 为 6022?
先谢谢了!!![/color:6f41fc64fa][/size:6f41fc64fa]

 gjp77 回复于:2004-09-20 19:19:49
用vi或者sed都可以的。命令记不清了,你找找以前的贴子,有的

 sdclearcase/" target="_blank" >ccf 回复于:2004-09-20 20:14:48
用sed处理:
sed -e 's/5062/6022/g'  yourfile.txt

用vi处理:
在命令状态下:

:g/5062/s//6022/g

 gjp77 回复于:2004-09-20 20:18:58
老大,在sed里是单引号还是双引号?

 sdccf 回复于:2004-09-20 20:23:21
都可以的。

 gjp77 回复于:2004-09-20 20:24:26
明白了,谢了

 sdccf 回复于:2004-09-20 20:26:08
你试一下就知道了。

 c1l2d3 回复于:2004-09-20 20:31:07
来个awk的:
长点儿 :oops: 
[code:1:a5d0e871a2]awk -F\| '{OFS="|"}{$4="6022"substr($4,5);print}' file[/code:1:a5d0e871a2]

 sdccf 回复于:2004-09-20 20:48:41
这下完整了。

 ChinaMobile 回复于:2004-09-20 21:07:03
cat yourfile|tr  "[5062]" "[6022]"
应该也可以,不过如果$2或者其他的字段里面也有5062的话,那要根据情况再进行修改了。还是awk写的比较严谨些。

 c1l2d3 回复于:2004-09-20 22:07:27
最近被perl所迷:
[code:1:ac24df9601]open(F,"<filename");while(<F>){@line=split(/\|/);$line[3]=~s/5062/6022/;print join("|",@line);};close(F);[/code:1:ac24df9601]

也很严谨

 .netrover 回复于:2004-09-20 22:17:56
vi 编辑
1,$s/5062/6022/g

 yutian 回复于:2004-09-21 09:14:48
窃以为把串前加一个"|"比较好,不会误换

 c1l2d3 回复于:2004-09-21 09:51:03
[quote:0d00cfe79c="yutian"]窃以为把串前加一个"|"比较好,不会误换[/quote:0d00cfe79c]

非也~~假如其他字段有以5062为开头,加"|"也是不行的.

 fl.w 回复于:2004-09-21 10:24:02
:em11: 俺也认为:
:g/|5062/s//|6022/g
更妥一些,但也不能完全保证其他字段被替换,最好awk筛一个。

 mudga 回复于:2004-09-21 11:17:11
用perl也可以很简单的
[code:1:b5791308fd]
perl -p -i -e "s/5062/6022/g" file
[/code:1:b5791308fd]

 rengongpu 回复于:2004-09-21 12:45:44
俺以为,还是VI比较好,不是什么多复杂的东西没有必要编程吧.有时也以利用一些其他软件,WINDOWS下的,(当然了,在同一局网内)

 zhkun 回复于:2004-09-21 14:28:18
我认为未必,若编辑一个经常使用的文本(如代收代发等等),可以使用shell程序,若只编辑一个一次使用的文本大可不必费神、劳其筋骨。

 tianci3982730 回复于:2004-09-22 11:33:19
多么无聊的话题啊

 redfoxmhy 回复于:2004-09-22 11:45:40
[size=18:72e2f29c09][color=blue:72e2f29c09]没想到有这么多哥哥姐姐帮忙,在此万福!!!
可今天我才发现文本有变如下:
2|502201940005|64466|50220110000500|24.90
2|502201940005|64466|50220110000528|35.90
2|502201940005|64466|50220110000537|28.60
2|502201940005|64466|50220110000611|36.90
2|502201940005|64466|50220110000622|29.30
用vi中的:g/|5022/s//6022/g
和sed替换 会把第二字段中的5022也换去啊,可要求是不能换啊
另外 有的哥哥说的awk 写的我看不太清啊,能...吗?
perl没用过能直接用吗?也会替换去第二段字中的5022 吗?
谢谢大家 了
另外 可能 有哥哥姐姐认为这是“无聊的话题啊 ”
不好意思 可我真的不太明白,是真心想问,你不要打击我好不?
我的心是很脆弱的,哈哈!
再次谢谢大家 了!!!! :em10:  :em13:  :em02: [/color:72e2f29c09][/size:72e2f29c09]

 CNL 回复于:2004-09-22 12:19:01
借c1|2d3的法子:
[code:1:49e2236b70]
awk -F\| '{OFS="|"}{$2="6022"substr($2,5);print}' file
[/code:1:49e2236b70]
OFS="|"告诉awk分隔符是"|"
$2表示第2个字段
 "6022"是你要换的新值,substr($2,5)表示第2字段从第5位开始的子串
$2=....表示更新第2字段内容为后面的值,
print打印出来
当然你可以输出到一个新文件里:
awk -F\| '{OFS="|"}{$2="6022"substr($2,5);print}'  oldfile > newfile

 redfoxmhy 回复于:2004-09-22 16:24:07
awk -F\| '{OFS="|"}{$2="6022"substr($2,5);print}' oldfile > newfile 
中的 -F\|  是连在一起的[color=blue:88c2b41e24][size=24:88c2b41e24]???[/size:88c2b41e24][/color:88c2b41e24]<<<-F re:允许awk更改其字段分隔符。>>>

 CNL 回复于:2004-09-22 18:39:30
-F\|是连在一起的,说明awk输入内容的分隔符是"|",前加\是防止|转义(|在shell里是特殊字符),
当然用单撇号把|括起来也可: awk -F'|' ....
OFS是指定print的输出分隔符,不一样的两个概念

 mudga 回复于:2004-09-22 18:53:43
用perl就没有awk这么方便了,那要写程序了。当然,如果只是全部替换,那还是很方便的

 redfoxmhy 回复于:2004-09-22 20:00:20
[color=blue:4789c7e8fc]一模一样的操作的可 sco505就是报错。............................
55555555555555555555555555555555555555 :(  :(  :( 
 :em10:  :em10:  :em10: 
#awk -F\|  '{[b:4789c7e8fc]OFS[/b:4789c7e8fc]="|"}{$2="6022"substr($2,5);print}' oldfile > newfile 

报 -F出错,错误提示没来的及抄下,明天再向哥哥姐姐汇报。
OFS 是大写的对吧? 

如果是这样:
awk -F  '{OFS="|"}{$2="6022"substr($2,5);print}' oldfile > newfile 
半天没动静,只是生成了一个空字节的文件 

AWK基本上是没用过,请哥哥姐姐不要笑啊!!!...............................[/color:4789c7e8fc]

 CNL 回复于:2004-09-22 21:01:28
[code:1:780e114efb]
awk     -F'|'     '{OFS="|"}{$2="6022"substr($2,5);print}'    old  > new
[/code:1:780e114efb]
这样呢?
-F后面啥都没有,分隔符会错的
awk语法:
awk [ -F sep ]  [ -v var=value ] ....

 redfoxmhy 回复于:2004-09-23 15:49:37
[color=blue:6b5cb3c4e9][size=18:6b5cb3c4e9]西西....
好了,一切顺利,谢谢哥哥姐姐们了!!!!!!!
 :mrgreen:  :em19:  :wink:  :wink:  :D  :D  :D  :oops: [/size:6b5cb3c4e9][/color:6b5cb3c4e9]

 swz 回复于:2004-09-23 16:58:35
用 C 写句不就结了.

 pucat 回复于:2004-11-02 13:51:11
呵呵,连我也懂的东西你也敢贴出现呀.用g/|5022011/s//6022011/g不就行了.

原文转自:http://www.ltesting.net