日期:2014-05-16  浏览次数:20594 次

shell在文件行末尾加字符过滤空行和注释的问题
各位,请教大家一个问题:
一个文件,里面有注释(#注释)和空行,我要在文件的每一行末尾加上一些字符,但是注释行和空行不加。要怎么过滤?
我使用这两种办法,都可以加,但是无法得到想要的结果:
awk '{print $0,"abc"}' tt.txt > t.txt  //无法过滤注释行和空行。
cat tt.txt | grep -v '^#' | grep -v '^$' | awk '{print $0,"abx"}' > t.txt//这样是过滤了,但是注释行和空行没了。

请问各位,要怎么做才达到效果:不在注释行和空行后面加,又要保留注释行和空行。

谢谢
------解决方案--------------------
元芳,CSDN新论坛上线!你怎么看?
------解决方案--------------------
awk的功能非常强大,只需使用这一个命令就可以实现。
awk '{if((NF != 0) && ($0 !~ /^#/)) $0 = $0" [my addition]"} {print $0}' source.txt > destination.txt
其中蓝色部分修改为需要添加的字符串。



以下内容仅是本人在尝试解决楼主需求的过程中所想到的问题,在此写出,仅作笔记。
根据楼主的需求,我还想到了一些比较特殊的情况,比如source.txt文件中的内容如下所示:
123
!@#
abc

#lksdjfklsdf
######adkj

[ ]123
[\t]9089
[ ][\t][ ]0987098
[\t][ ][\t]lkdlsjf

[ ]#dsklfsdkljfkldsjfklsdjjdfddddddddfff
[\t]#777
[ ][\t][ ]#999
[\t][ ][\t]#successful!

其中[ ]代表空格,[\t]代表制表符,即有些行的行首有任意多个空格或制表符。
如果依旧使用上面的awk命令,则最后4行的行尾会添加自定义的字符串,而这四行实际上是注释,不应添加。而使用如下的awk即可达到效果(修改的部分使用蓝色加粗标记):
awk '{if((NF != 0) && ($0 !~ /^[ \t]*#/)) $0 = $0" [my addition]"} {print $0}' csdn.txt > csdn1.txt
------解决方案--------------------
经过测试,如下简单代码可行:
sed 's/\(^[^#]\)/行首增加的字符串\1/g' 文件名
------解决方案--------------------
#!perl -w
use strict;

while(<>){
    next if /^\#\!/;
    next if /^\s*$/;
    #do something
    s/$//g; 
}