파일에 다른 줄이 있는 경우에만 파일에서 특정 줄을 제거하는 방법은 무엇입니까?

파일에 다른 줄이 있는 경우에만 파일에서 특정 줄을 제거하는 방법은 무엇입니까?

파일에 다른 줄이 있는 경우에만 파일에서 특정 줄을 제거하는 방법은 무엇입니까?

예를 들어 다음 파일을 건드리지 마세요.

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해당 파일이 단순히 포함으로 표시되지 않는 한 현재 디렉터리의 모든 파일에서 포함된 줄이 제거 됩니다 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

관련 정보