shell脚本读文件如何忽略空行和注释行

我这有两个shell脚本的函数,如果文件中出现空行,就会异常。
while read line
do
echo "$path" | grep -q "$line"
if [ $? -eq 0 ]; then
matched=1
break
fi
done < $PATHRULECFG
这段代码中,如果文件PATHRULECFG中出现空行和以"#"开头的注释行,如何忽略那一行。

while read path folder
do
echo "$fullpath" | grep -q "$path"
if [ $? -eq 0 ]; then
matched=1
break
fi
done < $CPYPATHCFG

这里一样的,如果文件CPYPATHCFG中有空行和注释行,如何忽略。

可以通过sed命令,将空行和注释行删除掉。

1、以下面的文档内容为例,#号开头的是注释,然后有很多空行,文档名为1.tt。

2、执行如下命令

sed '/^#.*\|^$/d' 1.tt
说明:^#.*说明以#字符开头的行,^$表示手空行,中间的\|是转义,表示或。d表示删除。

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-04-04
done < $PATHRULECFG

改为:

done < `egrep -v "(^$)|(^#)" $PATHRULECFG`

 

同理,

done < $CPYPATHCFG

改为:

done < `egrep -v "(^$)|(^#)" $CPYPATHCFG`

追问

请教一个问题:

为什么会打印出

mat: 1
matched: 0

while循环不能改变变量matched的值?

追答

出游归来...

管道符会开启新的shell,while循环是在新shell中执行,变量会被拷贝一份进入新shell,新shell执行结束其中的变量也会消亡,也就是说,循环体中的变量赋值是不能被带出来的。
这就是下面两种方式的主要区别之一:
1. cat file | while read line
2. while read line
do
done <file

追问

那如果我想带出来,又该如何写呢?
比如:
定义变量a=0
进入读文件的循环,每次读到一行line,因为要跳过空行,所以用grep了
do
如果line满足了某条件,a=1,line也需要记下来,break

while
这里,我希望知道a是否为1,如果为1,对应的line是什么?

我该如何做呢?

追答

想带出来,就用第二种结构:

while read line
do
   xxxxx
done <`grep -Ev "^$|^#.*$ ./cpypath.cfg"`
echo "mat:" $matched

或者用小括号将while后的echo语句跟while循环包在一起,这样就绑定在一个子shell中了。

grep -Ev "^$|^#.*$ ./cpypath.cfg | (while read path folder

do

     xxxxxx

done

echo "mat:" $matched)

追问

提示

该怎么解决呢,加括号那个办法确实可以,我试过了。

追答

不好意思,双引号的位置错了。。。看出来了吧。。。

追问

可是
done < `grep -Ev "^$|^#.*$" $PATHRULECFG`
也不行啊

追答

实践不行就说明的确不行...
< 用于从文件读入
从多行字符串读入用 <<< 吧,Here String

追问

我需要搞一个比较文件夹的shell脚本
http://zhidao.baidu.com/question/1795847883031359467.html
你看下这个,帮帮忙,谢谢!!!

追答

这个需要一些时间,现在上班时间干活儿要紧。
这里高手也很多,会有人来解决的。这个问题我后面有时间也会看看,若没得到解决我再上。

追问

好,谢谢哈

本回答被网友采纳
第2个回答  2014-04-04
可以用grep去掉
grep -v "^#" | grep -v "^$"追问

把这个加在什么地方啊

追答

cat CPYPATHCFG | grep -v "^#" | grep -v "^$"

追问

我要读取文件的每一行,然后使用那一行的数据(假设是1/2/3/)和传入的字符串(假设是1/2/3/4/5.txt)来匹配,如例子中就能够匹配成功。我希望可以存在一些空行和一些注释行。

该如何修改上面图片中的那个函数呢?

追答

不懂了,你不是说要去掉注释和空行吗?怎么现在又要添加空行和注释呢?

追问

请教一个问题:

为什么会打印出

mat: 1
matched: 0

while循环不能改变变量matched的值?

追答

我自己做了一个小脚本测试了一下,你可以看一下,比较一下区别



本回答被提问者采纳
第3个回答  2014-04-04
在echo的前面加上这样的一个语句:
if [[ $line =~ "" || $line =~ "^#" ] ;then
continue
fi追答

是我写错了,把那句话中的 ] 换成 ]]

追问

那如果那一行#之后还有内容呢,加个#本来想注释掉的。

你这个好像不能解决吧

第4个回答  2014-04-04
grep -Ev "^$|^#" PATHRULECFG

追问

把这个加在哪里呢?
我新手,help!!!

追答

直接执行就可以了。做个重定向把内容输出到一个新文件file里。

grep -Ev "^$|^#" PATHRULECFG > file

追问

我只是想,读文件的时候遇到了空行和以”#“开头的注释行,就直接跳过,重新读下面一条,不需要搞新文件啊。

追答

那你就直接执行好啦。grep也是读取文件。直接把空行和注释行 过滤掉不就完了。 何必还要自己去判断。while循环写这么麻烦?

追问

我要读取文件的每一行,然后使用那一行的数据(假设是1/2/3/)和传入的字符串(假设是1/2/3/4/5.txt)来匹配,如例子中就能够匹配成功。我希望可以存在一些空行和一些注释行。

如果像你说的这样,该如何修改这个函数呢?

shell脚本读文件如何忽略空行和注释行
可以通过sed命令,将空行和注释行删除掉。1、以下面的文档内容为例,#号开头的是注释,然后有很多空行,文档名为1.tt。2、执行如下命令 sed '\/^#.*\\|^$\/d' 1.tt说明:^#.*说明以#字符开头的行,^$表示手空行,中间的\\|是转义,表示或。d表示删除。

如何用shell脚本删除文件中的空行
可以通过sed命令,将空行和注释行删除掉。1、以下面的文档内容为例,#号开头的是注释,然后有很多空行,文档名为1.tt。2、执行如下命令 sed '\/^#.*\\|^$\/d' 1.tt说明:^#.*说明以#字符开头的行,^$表示手空行,中间的\\|是转义,表示或。d表示删除。

如何去掉linux配置文件的注释行和空行
1、使用grep -v "^#" 来去掉注释行,其中:-v 就是取相反的 ^# 表示以#开头的行 eg. grep -v "^#" \/etc\/vsftpd\/vsftpd.conf (也可以使用“>”来重写配置文件)2、有时也会连同空行一起去掉,使用管道符来完成(^$表示空行 )eg. grep -v "^#" httpd.conf | grep -v "...

shell脚本里怎么去掉其中两行注释并保存退出
试试这样: sed '\/^$\/d' input | awk '{print $0"\\n"}' >output处理input文件。 首先用sed去掉所有空行,然后通过awk在逐行打印时再加上一个空行。 结果保存到output文件中。

shell脚本读取配置文件参数
1、 读取配置文件时,将注释符#标记的行和空行全部过滤 sed -E '\/^#.*|^ *$\/d' $env_file 。 2、 匹配指定参数相符的行并截取对应的值 awk -F "${param}=" "\/${param}=\/{print \\$2}" 。 3、 获得的结果可能有多个,取最后一个值 tail -n1 。 4、这3步都用 | 管道符连接,其作用是将当...

shell如何读取文件的最后一非空行
1、sed -n '$p' $file打印尾行 2、sed -i '$d' $file删除尾行 3、例如a.sh !\/bin\/sh file=$1 if [[ -z $1 ]];then echo Usage $0 file;exit 0;fi while [[ -z $tt ]];do tt=$(sed -n '$p' $file)if [[ -z $tt ]];then sed -i '$d' $file fi done sed...

...删除文本文件中多余回车或提取文本中前两行数据的shell脚本,请...
这样删除空行,grep -E -v '^[\\t\\n ]*$' file > outfile 用脚本批量改,在该目录下放入这脚本 ! \/bin\/bash for i in *.txt # 假设副档为 .txt do grep -E -v '^[\\t\\n ]*$' "$i" > "$i".bak ret=$?if [ $ret -eq 0 ]then mv -f "$i" "$i".temp mv -f "...

SHELL脚本中怎么删除连续多个空行却保留一个。
试试这样:sed '\/^$\/d' input | awk '{print $0"\\n"}' >output处理input文件。首先用sed去掉所有空行,然后通过awk在逐行打印时再加上一个空行。结果保存到output文件中。

shell一行一行读取?
4、读取配置文件时,将注释符#标记的行和空行全部过滤sed-E\/^#.*|^*$\/d$env_file。匹配指定参数相符的行并截取对应的值awk-F${param}=\/${param}=\/{print\\$2}。shell读取并执行文件1、\\x0d\\x0a直接运行可执行的shell脚本之前,首先应使用下列chmod命令,把shell脚本文件设置为可执行的文件。

用shell找出文件首行为空,有哪些方案?
结合find和head命令,遍历文件目录,查看并筛选出首行为空的文件。Perl语言为文本处理提供强大工具,通过一行代码实现检查文件首行是否为空。编写Bash脚本提供更多灵活性,适用于复杂逻辑判断或错误处理,通过遍历文件,检查第一行内容。以上方案展现了Shell编程的多样性和高效性,选择最适合自己需求的工具,简化...

相似回答