2013-01-17 129 views
1

我想从文件中间删除以“#”开头的注释行,而不删除文件顶部的标题注释行。我怎样才能使用shell脚本和标准的Unix工具来做到这一点?删除文件中间的“#”注释行

#DO NOT MODIFY THIS FILE. 
#Mon Jan 14 22:25:16 PST 2013 
/test/v1=1.0 
#PROPERTIES P1. <------REMOVE THIS 
/test/p1=1.0 
/test/p2=1.0 
/test/p3=3.0 
/test/p41=4.0 
/test/v6=1.0 
#. P2 PROPERTIES <------REMOVE THIS 
/test/p1=1.0 
/test/p2=1.0 
/test/p3=3.0 
/test/p41=4.0 
/test/v6=1.0 
................. 
................. 

输出

#DO NOT MODIFY THIS FILE. 
#Mon Jan 14 22:25:16 PST 2013 
/test/v1=1.0 
/test/p1=1.0 
/test/p2=1.0 
/test/p3=3.0 
/test/p41=4.0 
/test/v6=1.0 
/test/p1=1.0 
/test/p2=1.0 
/test/p3=3.0 
/test/p41=4.0 
/test/v6=1.0 
................. 
................. 
+1

你在问如何修改一个文件“不要修改这个文件”。在顶部? –

+0

我试过使用sed的问题是,我无法删除该文件之间的评论,所有都被删除,我尝试保持第一个评论,并休息所有评论应该被忽略不能,因为我不会去的 – anish

+0

我要去第二个评论上面。你不应该修改那个文件。 – thang

回答

3

您可以尝试awk

awk 'NR==1 || NR==2 || !/^#/' file.txt 
+0

就像一个魅力一样工作 – anish

2

如果你不想用awk:

head -n 2 file.txt > output.txt 
grep -v "^#.*" file.txt >> output.txt 
+3

你可以这样做:'{head -n 2 file.txt; grep -v'^#'file.txt; }> output.txt' –

1

你想呼应线以'#'开头,但仅限于一开始只使用bash?从布尔值start=true开始;然后逐行进行,当线路不以#开始时,设置为start=false,并且仅当您处于起点或线路不以#开头时才回显每条线路。

这里的文件script

#!/bin/bash 

start=true 
while read line; do 
    if $start; then 
     if [ "${line:0:1}" != "#" ]; then 
      start=false 
     fi 
    fi 
    if $start || [ "${line:0:1}" != "#" ]; then 
     echo "${line}" 
    fi 
done 

运行它:

$ cat input 
#DO NOT MODIFY THIS FILE. 
#Mon Jan 14 22:25:16 PST 2013 
/test/v1=1.0 
#PROPERTIES P1. 
/test/p1=1.0 
/test/p2=1.0 
/test/p3=3.0 
/test/p41=4.0 
/test/v6=1.0 
#. P2 PROPERTIES 
/test/p1=1.0 
/test/p2=1.0 
/test/p3=3.0 
/test/p41=4.0 
/test/v6=1.0 
$ ./script < input 
#DO NOT MODIFY THIS FILE. 
#Mon Jan 14 22:25:16 PST 2013 
/test/v1=1.0 
/test/p1=1.0 
/test/p2=1.0 
/test/p3=3.0 
/test/p41=4.0 
/test/v6=1.0 
/test/p1=1.0 
/test/p2=1.0 
/test/p3=3.0 
/test/p41=4.0 
/test/v6=1.0 
+1

为什么选择在子shell中运行while循环? –

+0

好点 - 这没有什么好的理由。我修复了它。谢谢! – andrewdotn

1

随着GNU sed的,你有

sed '3,${/^#/d}' 
0

这可能会为你(GNU SED)的工作;

sed '/^[^#]/,$!b;/^#/d' file 
+0

你是否错过了正则表达式的结束斜杠? –

+0

@glennjackman哎呀!谢谢。 – potong