정확히 n개의 문자가 포함된 줄 삭제

정확히 n개의 문자가 포함된 줄 삭제

대용량 .txt 파일이 여러 개 있고 길이가 정확히 9자인 경우 줄을 삭제해야 합니다. 그 이상도 이하도 아닌.

awk/sed를 사용하여 이를 수행할 수 있는 방법이 있습니까?

답변1

sedGNU 의 확장 정규식을 사용하세요 :

for file in ./*.txt; do
    sed -i -r '/^.{9}$/d' "${file}"
done

(대신 FreeBSD/macOS에서 사용하고 -E(최신 버전의 GNU에서도 작동함) 대신)-r-Esed-i ''-i

지적한대로돈 크리스티, GNU를 사용하면 sed반복할 필요가 없습니다.

sed -s -i -r '/^.{9}$/d' ./*.txt

답변2

그리고 awk:

for f in ./*.txt; do
    awk 'length($0) != 9' "$f" >"destdir/$f"
done

그리고 sed:

for f in ./*.txt; do
    sed '/^.\{9\}$/d' "$f" >"destdir/$f"
done

그리고 grep:

for f in ./*.txt; do
    egrep -vx '.{9}' "$f" >"destdir/$f"
done

답변3

이것은 효과가 있을 수 있습니다:

grep -vE '^.{9}$' filename > new_filename

9를 원하는 문자로 전환하세요.

       -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
       -E, --extended-regexp
          Interpret PATTERN as an extended regular  expression  (ERE,  see
          below).

.{9}이 패턴이 9번 일치함을 나타내는 임의의 문자를 나타냅니다 . ^줄의 시작을 나타내고 $줄의 끝을 나타냅니다.

답변4

for i in *.txt
do
  egrep -v '^.........$' <"$i" >destdir/"$i"
done

sed또는 대신 사용을 고집하는 경우 egrep:

for i in *.txt
do
  sed '^.........$/d' <"$i" >destdir/"$i"
done

235자 길이의 줄을 삭제하려면 다음 안내를 따르세요.

X=""
for i in `seq 1 235`
do
  X="$X."
done

for i in *.txt
do
  egrep -v '^'"$X"'$' <"$i" >destdir/"$i"
done

단순함 그 자체!

관련 정보