我想从文件中间删除以“#”开头的注释行,而不删除文件顶部的标题注释行。我怎么能使用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
.................
.................
答案 0 :(得分:3)
您可以尝试awk:
awk 'NR==1 || NR==2 || !/^#/' file.txt
答案 1 :(得分:2)
如果您不想使用awk:
head -n 2 file.txt > output.txt
grep -v "^#.*" file.txt >> output.txt
答案 2 :(得分:1)
你想要回显以'#'开头的行,但只在开头,只使用bash?以布尔值start=true
开头;然后逐行,当行不以start=false
开头时设置#
,并且只有当你在开头或者行不以{{1}开头时才回显每一行}。
这是文件#
:
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
答案 3 :(得分:1)
使用GNU sed,你有
sed '3,${/^#/d}'
答案 4 :(得分:0)
这可能适合你(GNU sed);
sed '/^[^#]/,$!b;/^#/d' file