Что относительно того, чтобы добавить globstar
опция оболочки и -d
флаг к ls
к не автоматически перечисляют содержание каталога?
shopt -s extglob
shopt -s globstar
ls -d **/!(*.c)
решение решение решение для окружения вверх по списку альтернатив:
awk -v RS=', ' -F'=' '$1=="Foo"' <file>
лечить каждую запись, чтобы быть разграниченным ', «
, и разделить каждую запись на поля на =
характер (с использованием , а также.
). Тогда это просто вопрос сопоставления на первом поле $ 1
. Показанное здесь предложению - это простое сопоставление строк, не стесняйтесь использовать Regexes, E.g. $ 1 ~ / \
.
В зависимости от сложности вашей реальной мирной ситуации, это 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
В вашем примере нестабильное решение может включать 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 - даже для строк, которые не содержат ключей / значений, которые вы хотите напечатать.
Если у вас нет 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='