Как получить строку с префиксом «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.
Блок 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.