如何识别文件中一定长度的行


12

我想在我的代码中找到超过一定长度的行。我的代码在多个文件中。有什么好方法吗?

我想知道文件和行号;内容将是首选,但不是必需的。然后,练习的目的是弄清楚如何打破界限(可能是手动)。


您如何想要结果?作为行本身(它们的内容,如中所述grep),行号或其他内容(也许您想对它们执行其他操作)?可能最方便的方法取决于下一步如何处理这些行。
imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2014年

@ imz--IvanZakharyaschev好点。问题已更新。
Marcin

Answers:


13

grep

grep -En '.{12}' file

对于至少12个字符长的行。

有几个文件:

find . -type f -exec grep -En '.{12}' {} +

一些grep实现(例如GNU grep)可以自己进行文件查找。

grep -rEn '.{12}' .

但要注意符号链接和其他非常规文件。


我喜欢它,因为它很简单,而且我希望做这样的事情(至今还没有解决)。
Marcin 2014年

12

AWK解决方案

awk '{       
if (length($0) > 5)
        print $0;'} yourfile

或者,更简洁地说:

awk 'length > 5' file

9
我们可以缩短您的版本awk 'length > 5'
cuonglm

格诺克(Gnouc)是个大括号杀手;)
Ouki 2014年

1
+1 forawk 'length > 5'

3
使用GNU时awk,它会awk '/^.{6,}/'
显得

3
@ 1_CR,它是POSIX,可以缩短为awk '/.{6}/'(实际上,直到最近,GNU awk一直是这样,除非您将POSIXLY_CORRECT传递给它的环境,否则它将无法工作)。
斯特凡Chazelas

5

由于缺少的一件事是sed解决方案

sed -n '/^.\{6,\}/p' file

5

重击解决方案

#!/bin/bash

count=0

while read; do
    ((++count)) 
    len=${#REPLY}
    if ((len > 80)); then
        echo "Line $count is $len characters."
    fi
done

因此,例如./whatever.sh < input.file。这不包括通过从中减去1来换行$len;如果不希望这样,或者您的输入使用CRLF结尾,则应进行相应调整。


1
为什么不${#line}避开expr叉子?
iruvar 2014年

1
哈哈,+ 1为纯bash溶液。但是请注意,除非您坚持在IFS=前面,否则read前导空格将被忽略。
iruvar 2014年

1
添加了一些bash良好做法。另外请注意,换行符未考虑在内,$line因此无需减去一。
iruvar

2
@ 1_CR实际上,如果您不read指定要读取的名称,它将读取REPLY并包含所有空格。无需IFS设置。
kojiro 2014年

2
这将非常慢,并且专门处理反斜杠字符。while read处理文本的循环确实是不好的做法。
斯特凡Chazelas

4

使用perl(例如),假设您要搜索长度超过80个字符的行:

显示行:

$ perl -nle 'print if length > 80' your_file

要显示行号:

$ perl -nle 'print "$.\n" if length > 80' your_file

或两者:

$ perl -nle 'print "[$.]:  $_\n" if length > 80' your_file

3
您应该添加-l命令行,perl以计算行中的换行符。
cuonglm 2014年

1

红宝石:

ruby -lne 'puts $_ if $_.size > 5' intputfile

Python:

python -c "import sys;[ sys.stdout.write(''.join(line)) for line in sys.stdin if len(line.strip()) > 5 ]" < inputfile

1

这是另一个bash解决方案(bash 4):

minlen=5 # minimum length of a line
mapfile -tO1 < inputfile # Map the file to the array MAPFILE (by default)
                         # Start the array at index 1
for i in "${!MAPFILE[@]}"; do
  (( ${#MAPFILE[i]} > minlen )) || unset MAPFILE[i] # Remove shorter elements
done

结果数组很稀疏,因此可以维护数组索引。自从1开始,索引就是我们保留的行的行号。我们只能输出那些行号:

printf 'Long lines found at: '
printf '%d, ' "${!MAPFILE[@]}"
echo

或者我们可以自己输出行:

printf '%s\n' "${MAPFILE[@]}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.