如何从文本文件中删除超过特定字母和字符数的行?
例如:在此文本文件中:
a;dskjshdkjhgsdlhb5451candsncas;ldjch;sdkjncl
zdkcjsd#c
adsaskad@#s;l35684ad;sjdikm;
;okjilh@j
oieoigsb53454kdsjhcyavscjbkajlknscm;la,
如何自动删除(使用命令行)仅包含 8 个字母和字符的所有行?我问这个问题是因为我有一种文本文件,我只想删除其中包含 8 个(字母和字符)的行(它是所有文件之间的相似行,并且具有相同的字母和字符)。
答案1
尝试
awk 'length($0) == 8 ' old_file > new_file
使用 -== 8
或!= 8
表示等于,不等于。
答案2
grep -vEx '.{8}'
或者:
awk 'length != 8'
如果您的输入包含不形成有效字符的字节序列(例如,在处理使用错误编码的文件时,典型的 UTF-8 语言环境中的 0xe9 字节),请注意潜在的问题。
对于 GNU awk
,这些字节加起来不会等于 所返回的值length
。对于 GNU grep
,包含此类字节序列的那些行将不匹配,.{8}
因此这些行将被返回(因为-v
),否则您将得到一个二进制文件(标准输入)匹配信息。使用 GNU 时您也会遇到类似的问题sed
。
答案3
尝试使用sed
,.
匹配任何字符\{8\}
告诉它精确匹配其中的 8 个。表示^
从行首开始匹配,$
表示匹配到行尾,d
表示删除该行。
sed '/^.\{8\}$/d' file > newfile
或者如果您想更改现有文件,请使用 GNU sed
:
sed -i '/^.\{8\}$/d' file
如果您还想删除空行,则-e
允许您在同一命令中放置多个表达式
sed -i -e '/^.\{8\}$/d' -e '/^$/d'