【发布时间】:2012-04-12 06:30:39
【问题描述】:
如何删除文件中包含超过给定数量字母的所有行?例如
bear
rabbit
tree
elephant
如果我将其限制为 5 个字母或更少的单词,输出将是:
bear
tree
- 该文件包含各种外来字符,每个外来字符都应计为一个字母。
- 标点符号也可以算作一个字母。
【问题讨论】:
标签: bash
如何删除文件中包含超过给定数量字母的所有行?例如
bear
rabbit
tree
elephant
如果我将其限制为 5 个字母或更少的单词,输出将是:
bear
tree
【问题讨论】:
标签: bash
$ awk 'length<=5' input.txt
bear
tree
【讨论】:
以下方法可以解决问题:
sed -i '/^.\{5,\}$/d' FILE
这是什么意思:
就地删除(/ [...] /d)(-i 开关)所有符合以下模式的行:
^).) 重复 5 次或更多次 (\{5,\})$)来自名为FILE的文件。
【讨论】:
grep -v '......' myfile.txt
将传递五个字符或更少的行。
它通过“选择”包含六个或更多字符的行来执行此操作,然后使用-v 反转操作,只打印出那些不匹配的行。
【讨论】:
grep -Ev '.{6,}' 更通用,在这种情况下打高尔夫球也一样。然而,键入 6 个点比 .{6,} 更快。
"该文件包含各种外来字符,每一个都应算作一个字母。" 假设您的输入数据是 UTF8,这个 bash 过滤器脚本应该这样做。
#!/bin/bash
function px {
local a="$@"
local i=0
while [ $i -lt ${#a} ]
do
printf \\x${a:$i:2}
i=$(($i+2))
done
}
(iconv -f UTF8 -t UTF16 | od -x | cut -b 9- | xargs -n 1) |
if read utf16header
then
px $utf16header
cnt=0
out=''
while read line
do
cnt=$(($cnt+1))
if [ "$line" == "000a" ]
then
if [[ $cnt -le 5+1 ]] ; then
out=$out$line
px $out
fi
cnt=0
out=''
else
out=$out$line
fi
done
fi | iconv -f UTF16 -t UTF8
【讨论】: