Как получить строку с префиксом «Mat» в фигурных скобках {} и добавить запятую для вывода

Как получить строку с префиксом «Mat» в фигурных скобках {} и напечатать ее с добавлением запятой? например в:

import { MatSidenavModule } from '@angular/material/sidenav';
import { MatToolbarModule } from '@angular/material/toolbar';
import { RouterOutlet } from '@angular/router';

вне:

MatSidenavModule,
MatToolbarModule,

Я пытался:

awk -F"[{}]" 'BEGIN {/Mat/} {gsub(/ /, "", $2); print $2","}' in

Версия GNU Awk — 5.0.1.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
81
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Блок BEGIN должен содержать код, который вы хотите запустить перед основным скриптом. Я предполагаю, что ты хочешь

awk -F"[{}]" '/Mat/ {gsub(/ /, "", $2); print $2","}' in

Более точным условием было бы $2 ~ /Mat/, чтобы гарантировать, что вы не сработаете при случайных совпадениях в других полях (или даже используйте /^[ \t]*Mat/, если вы всегда ожидаете, что оно будет совпадать в начале поля).

awk -F"[{}]" '$2 ~ /^[ \t]*Mat/ {
    gsub(/[ \t]+/, "", $2);
    print $2 ","}' in

Использование Awk для подобных вещей в основном требует, чтобы входные данные использовали предсказуемое форматирование, а не, например. произвольно добавьте новую строку после import {. В пределе вам понадобится парсер для языка, который вы обрабатываете (Javascript?)

Используя любой awk:

$ awk -F' *[{}] *' -v ORS=',\n' '$2 ~ /^Mat/{ print $2 }' file
MatSidenavModule,
MatToolbarModule,

Используя показанные образцы, попробуйте следовать awk, используя функцию match с регулярным выражением \{ Mat[^}]*

awk '
match($0,/\{ Mat[^}]*/){
  print substr($0,RSTART+2,RLENGTH-2) ","
}
' Input_file

Я бы использовал GNU AWK для этой задачи следующим образом: пусть file.txt контент будет

import { MatSidenavModule } from '@angular/material/sidenav';
import { MatToolbarModule } from '@angular/material/toolbar';
import { RouterOutlet } from '@angular/router';

затем

awk '{sub(/.*{ /,"");sub(/ }.*/,",")}/^Mat/' file.txt

дает результат

MatSidenavModule,
MatToolbarModule,

Объяснение: я заменяю все до { пустой строкой, а } и все, что после нее, используя ,. Затем я проверяю, начинается ли теперь строка с Mat, и если да, то выполняется действие по умолчанию, т. е. print. Такое расположение предотвращает ложные срабатывания, если Mat присутствует где-либо за пределами {}, хотя оно все равно будет печататься, если строка начинается с Mat и не имеет фигурных скобок.

(проверено в GNU Awk 5.1.0)

{ — это метасимвол регулярного выражения, который запускает интервал повторения. Не определено, что он делает после другого метасимвола повторения (*), а также не определено, что он делает, если сразу за ним не следует цифра. Вам следует использовать /.*\{.../ вместо /.*{.../, чтобы получить определенное, переносимое поведение, которое также гарантированно будет работать в будущих выпусках gawk.
Ed Morton 10.06.2024 16:09

Другие вопросы по теме