Соберите все строки ровно с одним экземпляром определенного символа

Используя findи dirname, чтобы найти все файлы с именем minecraftв текущем каталоге, (отрегулируйте место поиска в соответствии с ).

find. -type f -name minecraft | xargs -L 1 dirname

Для поиска файлов с разрешениями на выполнение вы можете использовать параметр -permдля поиска (настроить значение в соответствии с вашими критериями поиска):

find. -type f -perm +0111 -name minecraft | xargs -L 1 dirname

Это должно напечатать путь к каталогу относительно места поиска .

Если вы хотите выполнить поиск по всей системе, просто передайте /в качестве первого аргумента для поиска.

5
04.07.2020, 00:13
4 ответа

Использование GNU grep:

$ grep -P '^(?!(?:.*#){2}).*#' infile
xxxxxxxxx#aaa
xxxxxxxxxxxxxxxx#
xxx#x
$

Параметр -P означает использование регулярных выражений PCRE (Perl Compatible Regular Expressions ). См. https://www.pcre.org. PCRE являются расширениями расширенных регулярных выражений ERE (), первоначально введенных в Perl, которые позже были приняты многими командами, утилитами, приложениями и языками программирования.

Если GNU grep недоступен на вашей платформе, вы можете установить pcregrep, который является частью пакета pcre-tools, доступного на многих платформах.

Обобщенная форма этого конкретного регулярного выражения PCRE::

^(?!(?:.*PATTERN){2}).*PATTERN

где PATTERNозначает шаблон, который должен встречаться один раз и только один раз в строке grepped. В нашем случае шаблон #.

  • ^-начало строки
  • (?!(?:.*PATTERN){2})-отрицательный просмотр вперед, который не соответствует совпадению, которое находится непосредственно справа от текущего местоположения, т. е. начала строки, если есть два({2})последовательных вхождения :
    • .*-0 или более символов
    • PATTERN-узор
  • .*-0 или более символов
  • PATTERN-узор
4
18.03.2021, 23:23

При двух вызовахgrep:выберите любую строку, в которой есть хотя бы один #, затем удалите те, в которых есть хотя бы два:

grep '#' filename | grep -v '#.*#'
10
18.03.2021, 23:23

С помощью awkмы можем использовать функцию gsub в блоке условий для выбора наших строк:

$ awk 'gsub(/#/, "#") == 1' file

$ awk '/#/ && ! /#.*#/' file 

$ sed -ne 's/#/&/2;t' -e '//p' file
  • Строки с не менее чем двумя #не будут напечатаны из-за команды tи опции -n, заданной для sed.
  • Это оставляет нам строки либо с ровно одним #, либо ни с одним. Печатайте бывший с //

С помощью perlмы можем подсчитать количество #символов в скалярном контексте, чтобы обнаружить наши строки:

$ perl -ne 'print if tr/#/#/ == 1'  file
1
18.03.2021, 23:23

команда

awk '{print $0,gsub("#",$1)}' filename |awk '$NF == "1"'

выход

xxxxxxxxx#aaa 1
xxxxxxxxxxxxxxxx# 1
xxx#x 1

питон

#!/usr/bin/python
import re
k=open('filename','r')
for i in k:
    if i.count("#") == 1:
        print i.strip()

выход

xxxxxxxxx#aaa
xxxxxxxxxxxxxxxx#
xxx#x
-2
18.03.2021, 23:23

Теги

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