如何使用sed查找仅在顶部包含一个字符串而其余行为空的文件

时间:2019-06-02 18:16:23

标签: awk sed

我想从文件列表中查找,这些文件的顶部仅包含一个特定的字符串,而使用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"

4 个答案:

答案 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
  1. 如果文件(文件编号记录)的第一行与/regex/相匹配(您应对其进行调整以匹配实际文件),则将文件名记录在数组中,然后跳至下一个输入行。

  2. 如果一行包含任何字符,请从数组中删除文件名并跳过文件。 (nextfile在这里并不重要,但可以大规模提高性能)

  3. 完成所有处理后,打印数组中的所有索引。

*.txt应该进行调整以匹配您要测试的所有文件。

答案 1 :(得分:0)

如果选择Perl,请尝试以下操作:

perl -0777ne 'print "$ARGV\n" if /^\S+(\r?\n)+$/s;' *.txt

答案 2 :(得分:0)

sed用于对单个字符串进行简单的s / old / new。使用nextfileENDFILE的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