Как найти файл, который содержит только одну строку вверху, а остальные строки пусты с помощью sed - PullRequest
0 голосов
/ 02 июня 2019

Я хотел найти из списка файлов, которые содержат только одну конкретную строку вверху, а остальные строки пусты с помощью 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 ]

3 голосов
/ 03 июня 2019

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 должен быть настроен так, чтобы соответствовать всем файлам, которые вы хотите проверить.

0 голосов
/ 04 июня 2019

Это может сработать для вас (GNU sed):

sed -znE '/^[^\n]*some string[^\n]*\n(\s*\n)+$/F' file1 file2 file3 ...

Это решение используется в каждом файле и использует сопоставление с образцом для определения имен файлов (F), которые содержат some string в первой строке в противном случае пустого файла.

0 голосов
/ 03 июня 2019

sed - это простой s / old / new для отдельных строк, вот и все.С GNU awk для nextfile и ENDFILE:

awk '
FNR==1  { if (!/Some text/) nextfile }
/./     { f=1; nextfile }
ENDFILE { if (f) print FILENAME; f=0 }
' *.txt

Если вы хотите, чтобы строки всех пробелов считались пустыми, измените /./ на NF.

0 голосов
/ 03 июня 2019

Если Perl - ваш выбор, попробуйте следующее:

perl -0777ne 'print "$ARGV\n" if /^\S+(\r?\n)+$/s;' *.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...