删除恰好包含 n 个字符的行

删除恰好包含 n 个字符的行

我有几个巨大的 .txt 文件,如果它的长度正好是 9 个字符,我需要删除一行。不多也不少。

有没有办法使用 awk / sed 来做到这一点?

答案1

使用 GNUsed的扩展正则表达式:

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

(在 FreeBSD/macOS 上使用-E代替(也适用于最新版本的 GNU )并代替)-r-Esed-i ''-i

正如所指出的唐克里斯斯蒂,使用 GNUsed你不需要循环:

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

简单本身!

相关内容