如何删除包含超过一定数量字母的所有行?

时间:2012-04-12 06:30:40

标签: bash

如何删除文件中包含超过给定字母数的所有行? E.g。

bear
rabbit
tree
elephant

如果我将其限制为5个字母或更少的字,输出将是:

bear
tree
  • 该文件包含各种外来字符,每个字符应计为一个字母。
  • 标点符号也可以算作一个字母。

4 个答案:

答案 0 :(得分:17)

$ awk 'length<=5' input.txt
bear
tree

答案 1 :(得分:8)

以下是诀窍:

sed -i '/^.\{5,\}$/d' FILE

这意味着什么:

删除(/ [...] /d)就地(-i切换)所有符合以下模式的行:

  • 行首(^
  • 后跟任意字符(.)重复5次或以上(\{5,\}
  • 后跟行结尾($

来自名为FILE的文件。

答案 2 :(得分:3)

grep -v '......' myfile.txt

将提供五行或更少的字符。

通过“选择”包含六个字符或更多字符的行,然后使用-v撤消操作来执行此操作,仅打印出匹配的字符。

答案 3 :(得分:1)

“该文件包含各种外来字符,每个字符都应该算作一个字母。” 假设您的输入数据是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