我这里没有代码示例,因为我根本不知道该怎么做,但我有一个文件。合法的空行是仅包含换行符的行。空格或标签是非法的。
如何检查某条线是否“合法空”?
如果它没有任何单词(我可以用wc -w
检查),我如何检查它是否没有空格或标签,只是换行?
所以我尝试过这样的事情:
while read line; do
if [[ "$line" =~ ^$ ]]; then
echo empty line
continue
fi
done < $1
但它不起作用。如果我在一个空行中加上一个“”,它仍然认为它是空的。
答案 0 :(得分:6)
如果您想要这些空行的行号:
perl -lne 'print $. if(/^$/)' your_file
如果你想删除没有Perl的那些行:
grep . your_file >new_file
如果你想使用Perl删除那些空行:
perl -i -lne 'print if(/./)' your_file
答案 1 :(得分:3)
术语:仅包含空格的行是空白行。没有任何内容的行(换行终结符除外)是空行。
read
内置文件剥离了前导和尾随空格。因此,如果它遇到一个空行,它将其参数设置为空字符串,而不管空格的数量。要避免此行为并返回未修改的输入行,请将字段分隔符设置为空(默认情况下,它们是空格,制表符和换行符):将IFS
变量设置为空字符串。有关更详细的说明,请参阅 Why is while IFS= read
used so often, instead of IFS=; while read..
? 。在您使用它时,将-r
选项传递给read
,除非您希望反斜杠换行序列为续行。
while IFS= read -r line; do
if [ -z "$line" ]; then
echo empty line
fi
done <"$1"
如果您想判断一行是否为空:
while IFS= read -r line; do
case "$line" in
'') echo "empty line";;
*[![:space:]]*) echo "non-blank line";;
*) echo "non-empty blank line";;
esac
done <"$1"
如果您愿意,可以使用Bash正则表达式匹配:
while IFS= read -r line; do
if [[ "$line" =~ ^$ ]]; then
echo "empty line"
elif [[ "$line" =~ ^[[:space:]]+$ ]]; then
echo "non-empty blank line"
else
echo "non-blank line"
fi
done <"$1"
这些也可以通过模式匹配来完成(使用shell通配符,它具有与常见正则表达式不同的语法):
while IFS= read -r line; do
if [[ "$line" == "" ]]; then
echo "empty line"
elif [[ "$line" != *[![:space:]]* ]]; then
echo "non-empty blank line"
else
echo "non-blank line"
fi
done <"$1"
如果您只想在文件中查找空行并且不以任何其他方式处理这些行,则可以使用grep:
if grep -qxF '' <"$1"; then
echo "$1 contains an empty line"
fi
如果您正在寻找非空的空行:
if grep -Ex '[[:space:]]+' <"$1"; then
echo "$1 contains a non-empty blank line"
fi
答案 2 :(得分:2)