/ / Jak możesz użyć perla i wyrażenia regularnego, aby dodać znak na końcu każdej nowej linii między dopasowaniami - wyrażenia regularne, bash, perl

W jaki sposób używać perla i wyrażenia regularnego do dołączania znaków na końcu każdej nowej linii między dopasowaniem - regex, bash, perl

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 № 1

Jeś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