我有几个巨大的 .txt 文件,如果它的长度正好是 9 个字符,我需要删除一行。不多也不少。
有没有办法使用 awk / sed 来做到这一点?
答案1
使用 GNUsed
的扩展正则表达式:
for file in ./*.txt; do
sed -i -r '/^.{9}$/d' "${file}"
done
(在 FreeBSD/macOS 上使用-E
代替(也适用于最新版本的 GNU )并代替)-r
-E
sed
-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
简单本身!