파일에 다른 줄이 있는 경우에만 파일에서 특정 줄을 제거하는 방법은 무엇입니까?
예를 들어 다음 파일을 건드리지 마세요.
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