如何使用sed
和查找长度超过 100 个字符且少于 150 个字符的行grep
答案1
使用sed命令
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
例如sed
:sed -n '/.../p'
:)
使用grep命令
grep -E '^.{101,149}$' infile
-E
这与 sed 的选项相同,-r
但用于grep
命令。因此,如果您不想使用它,只需转义花括号即可。
使用awk命令
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