Давайте предположим, что есть такая команда:
cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG
Вывод как таковой:
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
Теперь мой вопрос: Есть ли какая - либо команда , которые будут печатать только то , что находится внутри кавычек, то есть " "
?
И не могли бы вы немного объяснить команду? Спасибо! заранее, авансом.
command-line
text-processing
Рафаэль
источник
источник
cat
в трубе почти всегда является пустой тратой ресурсов (AKA UUOC );grep
может уже читать свои входные данные из файла (то есть,grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic
делает то же самое, но 1. Это короче 2. Это проще для понимания 3. Это не разветвление дополнительной оболочки и дополнительного процесса). В 99% случаев использование cat в начале канала без объединения нескольких файлов просто вредно. :)cat
, хотя и бесполезный в этом случае, в будущем упростит редактирование всей строки команд на случай, если вы захотите что-то изменить / добавить / удалить позже, возможно,tr
илиcut
, и т. Д., Не нужно будет искать и перемещать имя файла убедитесь, что другая команда его поддерживает, найдите, куда ее поместить и т. д. А для небольшого тестового файла он добавляет только 0,002 с. (Я, вероятно, потратил больше времени, набирая это, чемcat
cat
тут помощь? Вы можете сделатьgrep foo file | tr
или... | cut
так же легко, какcat file | tr | grep ...
.cat
Просто добавляет дополнительные пять символов, дополнительные трубы и дополнительный вызов программы и не упрощает ничего.Ответы:
Да, вы можете сделать это. Ваша команда будет:
который вернул бы только:
Команда
awk
использует разделители полей с-F
командой, и чтобы установить для нее двойные кавычки, вы вводите ее с одинарными кавычками, как вокруг-F'"'
. Затем он'{print $2}'
сообщает awk распечатать второй набор после разделителя полей.Надеюсь это поможет!
источник
cat
иgrep
. Вы можете заменитьcat
иgrep
расстаться сawk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic
. Меньше водопровода, позволяя AWK выполнять всю работу, на которую она более чем способнаawk
команду. =)Вы можете сделать это с помощью одной
grep
команды:Или (немного дольше и более обидно):
-P
: указываетgrep
интерпретировать шаблон как PCRE (регулярное выражение, совместимое с Perl);-o
: говоритgrep
распечатать только совпадение;^CONFIG_ARCH_DEFCONFIG="
: соответствуетCONFIG_ARCH_DEFCONFIG="
строке в начале строки;\K
: отбрасывает ранее подобранную подстроку;# 1:
[^"]*
: соответствует любому количеству любого символа нет"
(жадно).# 2:
.*?
: соответствует любому числу любого символа (лениво);(?=")
: lookahead (утверждение нулевой длины, оно не соответствует ни одному символу); соответствует, если следующий символ является"
.источник
Есть много способов снять кожу с этой кошки, вот
sed
способ:Здесь мы сопоставляем строку и получаем желаемую часть, то есть часть в двойных кавычках (
([^"]+)
), а затем заменяем всю строку только захваченной группой (\1
).Пример:
источник
Что нет
perl
?perl
Будет-p
Ринт каждой строки после применения сценария дается-e
.s/foo/bar/
Заменитfoo
сbar
. Закономерности в скобках «захвачены» и могут быть отнесены к$1
,$2
...$N
где$1
это первая картина в плен,$2
второй и т.д. регулярное выражение будет искать все до первой кавычки (.*?"
), а затем захватить 0 или более Непро-"
символов ([^"]*
) а потом все остальное. Все это заменено захваченным рисунком.Вы также можете оставить шаблон, соответствующий
perl
:источник
with open('/boot/config-3.19.0-32-generic') as f: for line in f: if line.startswith('CONFIG_ARCH_DEFCONFIG'): print line.split('"')[1]
Вот комбинация
grep
иcut
, которая делает ту же работу.Объяснение:
grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic
это та часть , которая находит строку, в стандартном синтаксисе ГРЭП:grep [OPTIONS] PATTERN [FILE...]
. Выход идет по трубе на следующую ступеньcut -d"\"" -f2
, Эта часть использует обрезку для обрезки текста, разделенного определенным разделителем (который указывается с-d
флагом). Мы должны избегать двойных кавычек с помощью обратной косой черты, чтобы оболочка позволяла использовать двойные кавычки в качестве одного из параметровcut
команды, а не вводить их в саму оболочку. Теперьcut
будем рассматривать вывод ,grep
как разделены"
и разделить на три колонны,CONFIG_ARCH_DEFCONFIG
,arch/x86/configs/x86_64_defconfig
и пустое пространство. Строка, которая нам нужна, это второй столбец, это означает, что нам нужно использовать-f2
флаг.источник
Так как я сейчас учусь,
python
здесь есть версия, использующая именно это.Образец прогона:
источник
line.startswith
Потому чтоre.match
он намного медленнее, чемstartswith