仅当文件中存在其他行时,如何从文件中删除特定行?
例如,不要触摸此文件:
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