сокращение для пар "ключ-значение"

Что относительно того, чтобы добавить globstar опция оболочки и -d флаг к ls к не автоматически перечисляют содержание каталога?

shopt -s extglob
shopt -s globstar
ls -d  **/!(*.c)
6
24.02.2015, 23:31
5 ответов

GREP может сделать это с помощью -O -O :

grep -o 'Foo=[^,]*' file
8
27.01.2020, 20:21

решение решение решение для окружения вверх по списку альтернатив:

awk -v RS=', ' -F'=' '$1=="Foo"' <file>

лечить каждую запись, чтобы быть разграниченным ', «, и разделить каждую запись на поля на = характер (с использованием , а также. ). Тогда это просто вопрос сопоставления на первом поле $ 1 . Показанное здесь предложению - это простое сопоставление строк, не стесняйтесь использовать Regexes, E.g. $ 1 ~ / \ / .

3
27.01.2020, 20:21

В зависимости от сложности вашей реальной мирной ситуации, это SED Команда может быть достаточно:

sed -n 's/^.*\(\<Foo=[^,]*\).*/\1/p'

Вот сработанный пример

FIELD='Foo'
sed -n "s/^.*\(\<${FIELD}=[^,]*\).*/\1/p' << xxEOFxx
Foo=1, Bar=2, Baz=3
Bar=4, Foo=2, Baz=3
Bar=42, Baz=42, Foo=3
xxEOFxx
Foo=1
Foo=2
Foo=3
2
27.01.2020, 20:21

В вашем примере нестабильное решение может включать cut :

tr ', ' '[\n*]' <input | cut -sd F -f1-

... который помещает каждую пару ключ / значение в отдельную строку с помощью tr , заменяя промежуточные запятые и пробелы в \ n ewlines, а затем вырезать ting out строки, которые не содержат F . Но это узкоспециализированный пример, и он может работать только в том случае, если вы можете быть уверены, что F встречается только в требуемых парах ключ / значение.

В противном случае я бы использовал sed :

sed 'y/ ,/\n\n/;/^Foo=/P;D' <input

Который также tr преобразует промежуточные запятые и пробелы в \ n ewlines, но тогда только P записать те пары ключ / значение, которые начинаются со строки Foo = . Пока пробелы являются надежными разделителями, приведенное выше будет работать для переносимой печати каждой пары ключ / значение Foo в отдельной строке независимо от того, сколько раз они могут встречаться в строке ввода, и ничего не будет печатать. else - даже для строк, которые не содержат ключей / значений, которые вы хотите напечатать.

2
27.01.2020, 20:21

Если у вас нет grep , доступного с параметром -o , это должно сделать также трюк:

sed -e 's/, /\n/g' | grep '^Foo='

Используется sed для замены каждой запятой + пробел новой строкой (разбиение каждой пары ключ-значение на отдельную строку), а затем grep для поиска только ключа 'Foo' .

Контрольный пример:

printf "%s\n" "Foo=1, Bar=2, Baz=3" "Bar=4, Foo=2, Baz=3" "Bar=42, Baz=42, Foo=3" \
    | sed -e 's/, /\n/g' | grep '^Foo='
1
27.01.2020, 20:21

Теги

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