怎样替换一行的最后几个字符和换行符为空?

替换文本文件中,以abc结尾的一行的"abc"和换行符,如下例子:
  1. >cat a.log
  2. a   abc
  3. b   abc
  4. c  
  5. abc
  6. d   abc
  7. e   abc

  8. 希望输出:

  9. >cat a.log
  10. a   b   c  
  11. d   e   
复制代码
使用awk的gsub,当文件很大(几百M)时,gsub会直接打屏?无法重定向结果出来。

有没有其它的方法 ?

作者: ljt2k   发布时间: 2011-05-30

回复 ljt2k


    sed ':a;/abc/{N;s/abc\n//g;ta}'

作者: wtuter   发布时间: 2011-05-30

回复 ljt2k
  1. awk '1' RS="abc\n" ORS=
复制代码

作者: yinyuemi   发布时间: 2011-05-30

回复 ljt2k


awk '/abc$/{sub(/abc$/,"");printf $0;next}1' file

作者: ywlscpl   发布时间: 2011-05-30

sed 's/abc\n//' file1

作者: louis_ly   发布时间: 2011-05-30

回复 yinyuemi
  1. >awk '1' RS="abc\n" ORS="" a.log
  2.    bc
  3. b   bc
  4. c  
  5. bc
  6. d   bc
复制代码
好像RS只支持一个字符,取第一个a了?

操作系统版本:
>uname -a
AIX DRCBP2 3 5 00C1CBD54C00

作者: ljt2k   发布时间: 2011-05-30



QUOTE:
回复  ljt2k


    sed ':a;/abc/{N;s/abc\n//g;ta}'
wtuter 发表于 2011-05-30 12:10




报错了:
  1. > sed ':a;/abc/{N;s/abc\n//g;ta}' a.log
  2. sed: 0602-417 The label :a;/abc/{N;s/abc\n//g;ta} is greater than eight characters.
复制代码
操作系统版本:
>uname -a
AIX DRCBP2 3 5 00C1CBD54C00

作者: ljt2k   发布时间: 2011-05-30



QUOTE:
sed 's/abc\n//' file1
louis_ly 发表于 2011-05-30 13:01




这个应该是不行的,因为sed本身就是按行的处理的;
sed有个N命令,是支持多行操作,但是好像是两行一次,所以要循环;
上面兄弟提供了一个循环的,但是执行报错了,你可以看给他的回复。

作者: ljt2k   发布时间: 2011-05-30



QUOTE:
回复  ljt2k


awk '/abc$/{sub(/abc$/,"");printf $0;next}1' file
ywlscpl 发表于 2011-05-30 12:43




    多谢,这个可以,请教一下,最后那个1是什么作用?

作者: ljt2k   发布时间: 2011-05-30

回复 ljt2k


    1就是1{print},{print}这个默认的action可以省略写

作者: ywlscpl   发布时间: 2011-05-30