Единственным решением было удалить 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
С 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
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
вернут вам только первую строку с обратной галочкой.