ファイルに別の行がある場合にのみ、ファイルから特定の行を削除する方法は?

ファイルに別の行がある場合にのみ、ファイルから特定の行を削除する方法は?

ファイルに別の行がある場合にのみ、ファイルから特定の行を削除する方法は?

たとえば、次のファイルに触れないでください。

cat file.txt
ASDF

ただし、このファイルから「ASDF」を削除してください。

cat file.txt
ASDF
TR422

「ASDF」以外に他の行があるからです。

Bash、Perl、または他の一般的なツールのソリューションを歓迎します。

答え1

使用bashsed

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

答え2

ファイル名に改行文字が含まれていないと仮定すると、ASDFそのファイルが単にインクルードとしてマークされていない限り、現在のディレクトリ内のすべてのファイルから含まれている行が削除されますASDFsedそのオプションがない場合は、一時ファイル-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

関連情報