строка grep между обратными кавычками

Единственным решением было удалить Docker с машины и -установить его заново.

$ sudo apt-get purge docker-ce
$ sudo rm -rf /var/lib/docker
$ sudo rm -rf /etc/docker
$ sudo apt-get remove docker docker-engine docker.io containerd runc
4
05.02.2021, 08:55
3 ответа

С GNU grep, который поддерживает расширение PCRE :

grep -Po '(?<=`)[^`]*(?=`)' infile

или вернуть aи cтолько, например, в `a`b`c`, вы бы сделали:

grep -Po '(?<=`)[^`]+(?=`(?:[^`]*`[^`]*`)*[^`]*$)'

вернуть все, что находится между парой обратных кавычек.

Советы:
(?<=...):положительный взгляд -сзади .
(?=...):положительный взгляд -вперед .
(?:...):не -захватывающая группа .
[^`]*:любой символ кроме обратной -галочка`


Сawk:

awk -F'`' '{ for(i=2; i<=NF; i+=2) print $i; }' infile
5
18.03.2021, 22:32

Используйтеcut:

cut -d'`' -f2  < file.txt
4
18.03.2021, 22:32

grepпо умолчанию возвращает строк , соответствующих заданному выражению. Таким образом, ваше выражение вернет всю строку, поскольку она соответствует выражению.

Вместо использования grepмы могли бы использовать sedдля редактирования строк, содержащих искомую строку.

Предполагая, что в строке есть только одна строка с обратной галочкой, мы можем отсечь все до первой обратной кавычки и после второй:

$ sed 's/[^`]*`//; s/`.*//' <file.txt
someString

Поскольку обратная кавычка не используется в регулярных выражениях, ее не нужно экранировать. Обратная галочка является специальной для оболочки (она вводит подстановку команд ), но поскольку мы используем одну строку -в кавычках, оболочка не будет рассматривать ее как особую.


Можно также сопоставить строку между обратными кавычками в группе захвата(\(...\)в sed), а затем заменить ею всю строку (, но лично я думаю, что это немного усложняет чтение ):

. ]
$ sed 's/[^`]*`\([^`]*\)`.*/\1/' <file.txt
someString

Все случаи использования [^`]в приведенных выше выражениях означают «какой-то символ, который не является обратной кавычкой».


Совершенно другой подход — сначала удалить все обратные кавычки, а затем удалить все, начиная с пустого места в строке:

$ tr -d '`' <file.txt | sed 's/[[:blank:]].*//'
someString

Класс символов [[:blank:]]соответствует одному символу пробела или табуляции.

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


Возвращаясь к grep... Если ваш grepимеет не -стандартную (, но обычно реализуемую)-oопцию для возврата только тех битов, которые соответствуют выражению из каждой строки, тогда мы можем использовать это так:

$ grep -o '`[^`]*`' <file.txt | tr -d '`'
someString

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

4
18.03.2021, 22:32

Теги

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