使用 sed 和 grep 根据长度过滤行

使用 sed 和 grep 根据长度过滤行

如何使用sed和查找长度超过 100 个字符且少于 150 个字符的行grep

答案1

使用命令

sed -nr '/^.{101,149}$/p' infile

分解如下:

  • -n:不打印

-n选项将阻止打印任何内容,除非发现明确的打印请求(^.{101,149}$行数大于 100 (>=101) 且小于 150 个字符 (<=149)“)。该/p标志用作重新打开打印的一种方式。

  • -r:-r(--regexp-extended)

启用-r扩展正则表达式。如果您的 sed 无法识别它,请将其替换-r为;-E如果您的 sed 版本不支持花括号,则您需要转义花括号。然后命令将是sed -n '/^.\{101,149\}$/p' infile

  • 只是^行首的锚点和$行尾的锚点。

  • 单字符.匹配任意单个字符

因此,你明白了,使用sed -nr '/^.{101,149}$/p' infile,我们正在寻找一条从开始到结束的线,该线具有或包含我们定义的规则。

这是一种复制功能的方法,grep例如sedsed -n '/.../p':)

使用命令

grep -E '^.{101,149}$' infile
  • -E这与 sed 的选项相同,-r但用于grep命令。因此,如果您不想使用它,只需转义花括号即可。

使用命令

awk 'length($0)>100 && length($0)<150' infile
  • length返回行的长度。在 awk 中,$0指定整行。因此,如果行的长度在 100 到 150 之间,则会打印出来。

答案2

另一种方法是使用bash

while read l; do nc=$(<<< "$l" wc -c); [ $nc -ge 101 ] && [ $nc -le 149 ] && echo "$l"; done < file

扩展成脚本:

#!/bin/bash
while read l; do
    nc=$(<<< "$l" wc -c)
    if [ $nc -ge 101 ]; then
        if [ $nc -le 149 ]; then
            echo "$l"
        fi
    fi
done < file

相关内容