我想从文件列表中查找,这些文件的顶部仅包含一个特定的字符串,而使用sed的其余行为空,有人可以帮助我解决这个问题。我要查找的文本文件包含联系人链接
line1:Some text
line2:blank line
line3:blank line
line4:blank line
.
.
.
.
.
.
so on
我尝试了此命令,但是它删除了空行。我不想删除空行,而是要查找由顶部和其余行为空的特定字符串组成的文件
sed -i "/^$/d" "file.txt"
sed -i "/^$/d" "file.txt"
答案 0 :(得分:3)
sed
功能强大而简洁,但相当不智能。 GNU awk
弥补了这一不足:
gawk '
FNR==1 && /Some text/ {a[FILENAME]++; next} #1
/./ {delete a[FILENAME]; nextfile} #2
END {for(f in a) print f} #3
' *.txt
如果文件(文件编号记录)的第一行与/regex/
相匹配(您应对其进行调整以匹配实际文件),则将文件名记录在数组中,然后跳至下一个输入行。
如果一行包含任何字符,请从数组中删除文件名并跳过文件。 (nextfile
在这里并不重要,但可以大规模提高性能)
完成所有处理后,打印数组中的所有索引。
*.txt
应该进行调整以匹配您要测试的所有文件。
答案 1 :(得分:0)
如果选择Perl
,请尝试以下操作:
perl -0777ne 'print "$ARGV\n" if /^\S+(\r?\n)+$/s;' *.txt
答案 2 :(得分:0)
sed用于对单个字符串进行简单的s / old / new。使用nextfile
和ENDFILE
的GNU awk:
awk '
FNR==1 { if (!/Some text/) nextfile }
/./ { f=1; nextfile }
ENDFILE { if (f) print FILENAME; f=0 }
' *.txt
如果您希望将所有空白行都视为空白行,请将/./
更改为NF
。
答案 3 :(得分:0)
这可能对您有用(GNU sed):
sed -znE '/^[^\n]*some string[^\n]*\n(\s*\n)+$/F' file1 file2 file3 ...
此解决方案包含在每个文件中,并使用模式匹配来识别文件名(F
),该文件名在否则为空文件的第一行中包含some string
。