仅当文件中存在其他行时,如何从文件中删除特定行?

仅当文件中存在其他行时,如何从文件中删除特定行?

仅当文件中存在其他行时,如何从文件中删除特定行?

例如,不要触摸此文件:

cat file.txt
ASDF

但从此文件中删除“ASDF”:

cat file.txt
ASDF
TR422

因为它除了“ASDF”之外还有其他线路。

我欢迎 bash、perl 或任何其他常用工具的解决方案。

答案1

bash使用sed

if [[ $(< "$file") != "ASDF" ]]; then
  sed -i '/^ASDF$/d' "$file"
fi

答案2

假设您的文件名不包含换行符,这将从ASDF当前目录中的所有文件中删除包含 just 的行,除非该文件由仅包含ASDF.如果您sed没有该-i选项,请输出到临时文件,然后将其移动到位。

grep -l ASDF -- * | while IFS= read -r filename; do
  if ! echo 'ASDF' | cmp -s - "$filename"; then
    sed -i -e '/^ASDF$/d' -- "$filename"
  fi
done

这是另一种方法,它删除这些ASDF行,并且仅在新文件既不为空也不与原始文件相同时才覆盖原始文件。

tmpfile=$(mktemp -p "$(dirname -- "$filename")")
sed '/^ASDF$/' <"$filename" >"$tmpfile"
if [ -s "$tmpfile" ] && ! cmp -s -- "$filename" "$filename"; then
  mv -f -- "$tmpfile" "$filename"
else
  rm -- "$tmpfile"
fi

答案3

您可能想要查找文件中的行数。

伪代码:

if (numberOfLines > 1 && file.contains("ASDF")) {
    file.remove("ASDF");
}

答案4

您可以sed仅执行此操作,无需进行 shell 测试等:

sed '1{/^ASDF$/{$q;d;};}' infile

相关内容