Bash 删除“#&引用;文件中间的注释行

Bash 删除“#&引用;文件中间的注释行,bash,shell,Bash,Shell,我希望删除文件中间以“#”开头的注释行,而不删除文件顶部的标题注释行。如何使用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 PROPERT

我希望删除文件中间以“#”开头的注释行,而不删除文件顶部的标题注释行。如何使用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
.................
.................
您可以尝试:

您可以尝试:


如果您不想使用awk:

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

如果您不想使用awk:

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

是否要回显以“#”开头的行,但仅在开头使用bash?以布尔值开始
Start=true
;然后逐行执行,当行不以
#
开头时,设置
start=false
,并且仅当您在开头或行不以
#
开头时,才回显每一行

下面是文件
脚本

#!/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
$cat输入
#不要修改此文件。
#2013年1月14日星期一22:25:16太平洋标准时间
/测试/v1=1.0
#属性P1。
/测试/p1=1.0
/测试/p2=1.0
/测试/p3=3.0
/测试/p41=4.0
/测试/v6=1.0
#.P2物业
/测试/p1=1.0
/测试/p2=1.0
/测试/p3=3.0
/测试/p41=4.0
/测试/v6=1.0
$。/脚本<输入
#不要修改此文件。
#2013年1月14日星期一22:25:16太平洋标准时间
/测试/v1=1.0
/测试/p1=1.0
/测试/p2=1.0
/测试/p3=3.0
/测试/p41=4.0
/测试/v6=1.0
/测试/p1=1.0
/测试/p2=1.0
/测试/p3=3.0
/测试/p41=4.0
/测试/v6=1.0

是否要回显以“#”开头的行,但仅在开头使用bash?以布尔值开始
Start=true
;然后逐行执行,当行不以
#
开头时,设置
start=false
,并且仅当您在开头或行不以
#
开头时,才回显每一行

下面是文件
脚本

#!/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
$cat输入
#不要修改此文件。
#2013年1月14日星期一22:25:16太平洋标准时间
/测试/v1=1.0
#属性P1。
/测试/p1=1.0
/测试/p2=1.0
/测试/p3=3.0
/测试/p41=4.0
/测试/v6=1.0
#.P2物业
/测试/p1=1.0
/测试/p2=1.0
/测试/p3=3.0
/测试/p41=4.0
/测试/v6=1.0
$。/脚本<输入
#不要修改此文件。
#2013年1月14日星期一22:25:16太平洋标准时间
/测试/v1=1.0
/测试/p1=1.0
/测试/p2=1.0
/测试/p3=3.0
/测试/p41=4.0
/测试/v6=1.0
/测试/p1=1.0
/测试/p2=1.0
/测试/p3=3.0
/测试/p41=4.0
/测试/v6=1.0
使用GNU,您就可以

sed '3,${/^#/d}' 
有了GNU sed,您就有了

sed '3,${/^#/d}' 
这可能适合您(GNU sed)

这可能适合您(GNU sed)


你在问如何修改一个写着“不要修改这个文件”的文件。在顶部?我试着使用sed。问题是我无法删除文件之间的注释,所有的都被删除了,我尝试保留第一条注释,其余的注释都应该忽略。我将再次添加上面的注释。您不应该修改该文件。您正在询问如何修改一个写有“请勿修改此文件”的文件。在顶部?我尝试使用sed。问题是我无法删除文件之间的注释,所有注释都被删除,我试着保留第一条评论,其余所有评论都应该被忽略,不能成功。我将支持上面的评论。你不应该修改那个文件。你可以一次修改:
{head-n2 file.txt;grep-v'^#'file.txt;}>output.txt
你可以一次修改:
{head-n2 file.txt;grep-v'^#file.txt;}>output.txt
你为什么选择在子shell中运行while循环?很好,这并没有很好的理由。我已经修好了。谢谢为什么选择在子shell中运行while循环?很好,这并没有很好的理由。我已经修好了。谢谢是否缺少开始正则表达式上的结束斜杠?是否缺少开始正则表达式上的结束斜杠?