grep все строки, которые начинаются с определенной подстроки и заканчиваются первой кавычкой

Подсчет количества букв в именах файлов не является безопасным способом определения переименованного имени файла.

Вместо этого создайте простой список имен в файле и сравните его с существующим списком. Используя diff, вы увидите, какие именно строки (и )в списке изменились.

#!/bin/sh

LC_ALL=C

newlist=$HOME/filelist.new
oldlist=$HOME/filelist.old

echo /usr/hdp/2.6.4.0-91/tez_hive2/lib/*.jar >"$newlist"

if [ -f "$oldlist" ]; then
    diff -u "$oldlist" "$newlist"
fi

mv "$newlist" "$oldlist"

Очевидно, что в первый раз, когда вы это сделаете, filelist.oldне будет существовать, поэтому diffне запустится.

Обратите внимание, что я сохраняю полный путь к каждому файлу в выходном файле. Это не имеет значения, поскольку путь к каталогу является статическим.

Измените echoна ls -l, если вы хотите также сравнить метки времени и т. д. Измените его на stat, если вы хотите сравнить еще больше метаданных (это будет генерировать вывод различий, когда даже последний -метка времени доступа к файлу изменена ). Установите wdiffи измените diffна wdiff, чтобы получить разницу на основе слова -, а не строки -.

Параметр LC_ALL=Cдолжен гарантировать непротиворечивую сортировку расширения оболочки глобуса.

0
18.06.2019, 14:58
1 ответ

grepпо умолчанию использует регулярное выражение Posix Basic .

.*в базовом регулярном выражении всегда является жадным соответствием , то есть оно соответствует чему угодно до последнего"в строке.

Вместо этого вы можете использовать [^"]*для соответствия чему угодно, кроме ".

grep -o 'Competition="[^"]*"' 'Soccer_Data.xml' | sort --unique

Выход:

Competition="FA Cup"

В качестве альтернативы можно использовать регулярное выражение, совместимое с Perl, которое предоставляет не -жадный модификатор(.*?).
Вы можете использовать grep -P, если ваша версия grepпредусматривает (, и она будет, поскольку вы добавили тег [ubuntu]к своему вопросу ).

grep -Po 'Competition=".*?"' 'Soccer_Data.xml' | sort --unique

или получать только FA CUP, используя, например,. «Держать -снаружи»-->\K:

grep -Po 'Competition="\K[^"]*' 'Soccer_Data.xml' | sort --unique

Выход:

FA Cup
1
28.01.2020, 02:40

Теги

Похожие вопросы