【问题标题】:How to delete all lines containing more than a certain number of letters?如何删除包含超过一定数量字母的所有行?
【发布时间】:2012-04-12 06:30:39
【问题描述】:

如何删除文件中包含超过给定数量字母的所有行?例如

bear
rabbit
tree
elephant

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

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

【问题讨论】:

标签: bash


【解决方案1】:
$ awk 'length<=5' input.txt
bear
tree

【讨论】:

    【解决方案2】:

    以下方法可以解决问题:

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

    这是什么意思:

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

    • 行首 (^)
    • 后跟任意字符 (.) 重复 5 次或更多次 (\{5,\})
    • 后跟换行符 ($)

    来自名为FILE的文件。

    【讨论】:

      【解决方案3】:
      grep -v '......' myfile.txt
      

      将传递五个字符或更少的行。

      它通过“选择”包含六个或更多字符的行来执行此操作,然后使用-v 反转操作,只打印出那些匹配的行。

      【讨论】:

      • grep -Ev '.{6,}' 更通用,在这种情况下打高尔夫球也一样。然而,键入 6 个点比 .{6,} 更快。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2016-12-16
        • 2022-11-17
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多