ファイルに別の行がある場合にのみ、ファイルから特定の行を削除する方法は?
たとえば、次のファイルに触れないでください。
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
そのファイルが単にインクルードとしてマークされていない限り、現在のディレクトリ内のすべてのファイルから含まれている行が削除されます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
シェルテストなどなしでこれを行うことができます。
sed '1{/^ASDF$/{$q;d;};}' infile