Виявлення візерунка в кінці рядка із грейпом


64

Якщо я:

$ ls -R
.:
4Shared/  Cloud/

./4Shared:
UFAIZLV2R7.part3.rar

./Cloud:
UFAIZLV2R7.part2.rar.part
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part4.rar.part

Якщо я хочу лише перелічити .rarфайли, і я використовую grep , він також покаже мені .rar.partфайли, що не є моїм бажанням.
Я вирішую це за допомогою findабо, ls **/*.rarяк сказано в цій темі, і вони добре працюють, але я хотів би дізнатися, чи можна це зробити через grep.

Я спробував (думаючи про EOL):

ls -R | grep ".rar\n"

без результатів.
Я думаю, що проблема полягає в тому, щоб дізнатись, чи знайдеться в кінці рядка зібрання , але я не впевнений.

Будь-яка допомога тут, будь ласка?


Навіщо ви хочете використовувати grepв цьому випадку? Чому ні find?
devnull

1
@devnull, знаючи, як виявити шаблони, що знаходяться лише в кінці рядка, може бути корисним у багатьох випадках. Наприклад: портативність, використання в маршрутизаторах із вбудованим занадто спрощеним Linux, використання UnxUtils для Windows (його findкоманда суперечить Windows 1) та ... навчання ;-). Питання не в тому, щоб "перерахувати файли в режимі" (це лише власний приклад), а про "розуміння використання команди grep"
Sopalajo de Arrierez

1
чесно, якщо ви розраховуєте, що кінець рядка буде вашим роздільником, то вам слід скористатися ls -1R.
mikeserv

1
І вам навіть не потрібно grep. Дивіться мою відповідь.
mikeserv

@mikeserv, що може статися без -1Rперемикача. Мабуть, результати однакові.
Sopalajo de Arrierez

Відповіді:


88

$Якір відповідає кінцю рядка.

ls -R | grep '\.rar$'

Ви також можете використовувати findдля цього:

find . -name '*.rar'

Я не усвідомлював "." потрібно уникнути грепом. Чи трактується це як майна?
thebunnyrules

1
@thebunnyrules "." в регулярному виразі означає одного будь-якого символу
Йорданм

10

Крім вашого запитання, зверніть увагу, що .rarвін відповідає не лише ".rar", але відповідає кожному символу (включаючи .) перед rar. У цьому випадку, мабуть, це не проблема, але .треба уникати у регулярних виразах.

ls -R | grep "\.rar$"

Ви мали на увазі, що .ascце як *ascзразок? Так що це буде відповідати, наприклад, whereverasc.
Sopalajo de Arrierez

2
@SopalajodeArrierez Ні, він не відповідає кожній групі символів, а кожному окремому символу, наприклад xrar.
Hauke ​​Laging

5

Ви також можете доручити grepшукати рядок, починаючи з межі слова. A .є одним із таких меж.

$ ls -R | grep '\brar$'

Приклад

Скажімо, у мене є ці вибіркові дані.

$ ls -1
afile.rar
xrar
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part2.rar.part

Ця команда знайде лише файл з .rarрозширенням.

$ ls -R | grep '\brar$'
afile.rar

Як це працює?

Метахарактер \b- це якор, як карета та знак долара. Він збігається в позиції, яку називають "межами слова". Ця відповідність дорівнює нулю.

Ситуації, коли це не спрацює

Якщо у вас є такі файли, blah-rarвони також будуть виявлені.

$ ls -R | grep '\brar$'
afile-rar
afile.rar

Це тому, що символи, окрім буквено-цифрових, зазвичай вважаються прикордонними символами, і тому вони не пропускатимуть цей підхід.


Здається, це на перший погляд те саме, але це дещо інакше. Дякую, @slm. Це турбує, якщо я використовую подвійні лапки "замість простих лапок?
Sopalajo de Arrierez

1
@SopalajodeArrierez - ні в якому разі не працює. Тут знайдуться будь-які файли, які можуть бути названі починаючи з w / .rar. Але це не буде проблемою з використанням ls -R. Тільки якщо вам трапилось користуватися ls -Ra.
slm

Хтось із вас зацікавився б пояснити суспільству цю незначну різницю?
Hauke ​​Laging

@HaukeLaging -PПерехід до grepмого прикладу. Це запускає інтерпретацію аргументу PCRE.
slm

1
@SopalajodeArrierez - якщо файл містить символ нового рядка ( \n), який є юридичним символом. ls -1RЗмусить файли , які будуть відображатися в одному стовпці незалежно.
slm

0

Просто зробіть:

ls -1R -I"?" -I"??" -I"???" -I"*[!.][!r][!a][!r]"

Вам зовсім не потрібно grep.

ПРИМІТКА . Вищезгадане працює ... за винятком того, що він все ще отримує принаймні, afile-rar і я не розумію, чому. Я залишу його тут, але не пишаюся цим. У будь-якому випадку, як казали інші:

find . '*.rar'

Це не блокувало файли з ім'ям xrarабо afile-rar.
slm

Я ще отримую інші файли у висновку.
slm

@slm Які ще файли? Я думаю, це може бути причиною того, що вони занадто короткі. Я просто помітив це сам. Я це теж виправив.
mikeserv

Файли afile-rarі xrarдосі включаються у висновок. Немає змін і з останніми модами. Пеські проблеми немає? Приємно намагатися вирішити це без звичайних методів 8-)
slm

@slm Так, саме тому я приїжджаю сюди. Я не розумію, чому -dashпробивається. Річ xrar, з якою я міг би впоратися, але не -dash.я не розумію-dash.
mikeserv

0

Використовуйте одинарні лапки, щоб змусити $ працювати як кінець рядка. Якщо ви також хочете пов'язуватися з деякою змінною, використовуйте комбінацію подвійних і одиничних лапок, як показано нижче:

grep "$var"'$'

Мій попередній пост було видалено, сказавши, що він дублюється. Дозвольте пояснити, як це відрізняється.

В інших публікаціях згадується або повне використання подвійних цитат "", або повне використання одиничних лапок ''. Вони обоє мають свої обмеження. Слідом це пояснює.

Проблема з усіма подвійними лапками полягає в наступному: grep "pattern$"видає таку помилку:Illegal variable name.

І використання всіх одиничних лапок працює, але якщо ви хочете змінної підстановки, всі одиничні лапки не працюватимуть. Наприклад:

Якщо у мене є рядок A_BOOK, включаючи інші рядки у файлі FILE.

$ cat FILE
A_BOOK
B_BOOK_NOT_LAST
C_BOOK

Якщо я встановив КНИГУ змінну BK

set BK = BOOK

Якщо я промацую всі подвійні лапки, я отримую таку помилку:: grep "${BK}$" FILE*1-й $ для заміни змінної, 2-й для кінця шаблону ( Незаконне ім'я змінної ).

Якщо я вітаюсь з усіма одиничними цитатами, підміна змінної не відбувається. grep '${BK}$' FILEнічого не повертає

Якщо я використовую комбінацію подвійних та одинарних лапок, я отримую те, що очікую. Подвійні лапки для змінної підстановки та одиничні лапки на кінець шаблону.

$ grep "${BK}"'$'  # << gives expected output
A_BOOK
C_BOOK

Схоже, ви використовуєте csh. "foo$"Синтаксис працює відмінно на ш і сім'ї.
Олорін

Так, Олорін. Я використовую tcsh. Дякуємо, що вказали на це.
користувач274900

0

Якщо після виконання вищезазначеного і нічого не працює, це може бути пов’язано з закінченнями рядків. Щоб виправити, зробіть: dos2unix pr0n.txtі зробіть grepще раз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.