检查文件中的空行

时间:2013-12-26 13:16:51

标签: bash file unix

我这里没有代码示例,因为我根本不知道该怎么做,但我有一个文件。合法的空行是仅包含换行符的行。空格或标签是非法的。

如何检查某条线是否“合法空”?

如果它没有任何单词(我可以用wc -w检查),我如何检查它是否没有空格或标签,只是换行?

所以我尝试过这样的事情:

while read line; do
    if [[ "$line" =~ ^$ ]]; then
        echo empty line
        continue
    fi
done < $1

但它不起作用。如果我在一个空行中加上一个“”,它仍然认为它是空的。

3 个答案:

答案 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)

您可以使用

检查空行
^$

^是一行的开头,$是一行的结尾,如果没有其他字符,则上述匹配。

您现在可以在例如

sed '/^$/d' input.txt

这将删除输入文件中的所有空行。 这将从文件中删除空行并在控制台上显示文件内容。该文件仍然保持不变。

如果要从文件中删除空行(意味着更改文件内容),请运行:

sed -i '/^$/d' input.txt