ja używam bash
perl
i sed
do pobierania zapytań GraphQL i konwertowania ich na typy TypeScript. Mam wszystko rozpracowane, z wyjątkiem jednego elementu - nie mogę wymyślić, jak wstawić przecinek na końcu każdej linii w dopasowaniu wyrażenia regularnego.
To jest surowe *.graphqls
tekst, który pomyślnie dopasowuję:
enum ContentType {
LESSON
WARMUP
QUIZ
PROJECT
}
Regex, który dopasowuje (wybiera wszystko pomiędzy i włącznie enum
i }
):
s/(?s)(?=enum).*?(})
Mogę z łatwością zastąpić cały ten segment bash
i perl
:
ENUM_MATCH="s/(?s)(?=enum).*?(})/replacement/"
perl -i -0pe "${ENUM_MATCH}" "${FULL_PATH}"
Ale to, co muszę zrobić, to zastąpić ten tekst wyliczenia tym samym tekstem, z wyjątkiem przecinka na każdym wierszu wyliczenia - wynik końcowy wyglądałby następująco:
enum ContentType {
LESSON,
WARMUP,
QUIZ,
PROJECT
}
Odpowiedzi:
1 dla odpowiedzi № 1Jeśli przecinek końcowy (po PROJECT
) jest dozwolone, co jest legalne od C99 i C ++ 11
perl -i -pe"if ($r = /^s*enum/ .. /}s*$/) { s/$/,/ if $r!=1 && $r!~/E0$/ }" file
Używa operator zasięgui jego zwrot, aby wykluczyć pierwszą i ostatnią linię.
0 dla odpowiedzi nr 2
awk one-liner działa na twoim przykładzie:
awk "/enum .*{/{print;next}p{print p (/}/?"":",")}{p=$0}END{print p}" file
0 dla odpowiedzi № 3
Gdyby ,
jest dozwolone po PROJECT
:
awk "$1=="}"{f=0} f{$0=$0 ","} $1=="enum"{f=1} 1" data
0 dla odpowiedzi nr 4
Z przecinkiem końcowym:
s{enum[^{]*{K([^}]*)}{ $1 =~ s/n/,n/gr }seg
Bez:
s{enum[^{]*{K([^}]*)}{ $1 =~ s/n/,n/gr =~ s/,(?=[^,]*z// }seg