/ / Jak zmniejszyć (odjąć) liczbę w pliku z sed - bash, unix, sed

Jak zmniejszyć (odjąć) liczbę w pliku z sed - bash, unix, sed

Mam kod źródłowy podobny do następującego, w którym wywołuję funkcję C:

void myFunction (
&((int) table[1, 0]),
&((int) table[2, 0]),
&((int) table[3, 0])
);

...Jedynym problemem jest to, że funkcja ma> 300 parametrów (jest to automatycznie wygenerowana owijka do inicjowania i wywoływania całego modułu, została mi dana i nie mogę tego zmienić) i jak widać: zacząłem korzystać z tablica z 1 zamiast 0... Wielkie czasy, modyfikując wszystkie 300 parametrów, tj. Ręcznie zmniejszając 300 x współrzędną x tablicy.

Rozwiązaniem, którego szukam, jest to, jak mogę wymusić sed aby wykonać pracę dla mnie;)

EDYCJA: Zwróć uwagę, że powyższa składnia dostępu do tablicy dwuwymiarowej w C jest w każdym razie błędna! Oczywiście, że tak powinno być [1][0]... (więc nie tylko kopiuj i wklej;))

Odpowiedzi:

1 dla odpowiedzi № 1

Zasadniczo polecenie, które wymyśliłem, było następujące:

sed -r "s/(.*)(table[)([0-9]+)(,)(.*)/echo "12$((3-1))45"/ge" inputfile.c > outputfile.c

Cóż, na pierwszy rzut oka nie wygląda to bardzo intuicyjnie - a brakowało mi dobrych wyjaśnień prawie dla każdego znalezionego przykładu.

Tak więc postaram się podać szczegółowe wyjaśnienie na ten temat:

sed

-> podstawowe polecenie

-r

-> większość przykładów znajduje się w użyciu -e; Jednakże -r Parametr (działa tylko z GNU sed) umożliwia rozszerzone wyrażenia regularne i zapewnia wsparcie dla + w wyrażeniu regularnym. Zasadniczo oznacza "jeden lub więcej dopasowań".

"s/input/output/ge"

-> jest to podstawowa składnia zastępcza. Zasadniczo oznacza to "wymień" wejście "przez" wyjście "". The /g jest flagą "globalną", tzn. sed zastąpi wszystkie wystąpienia, a nie tylko pierwsze. Możesz dodać dodatkowe e aby wykonać wynik w bashu. Właśnie to chcemy zrobić, aby obsłużyć obliczenia.

(.*)

-> to pasuje do "everthing" od ostatniego meczu do następnego meczu

(table[)

-> jest uciec ze wspornika. Ta część wyrażenia będzie pasować do ciągów podobnych table[

([0-9]+)

-> ten dopasowuje liczby z co najmniej jedną cyfrą, jednak może również dopasowywać wyższe liczby z więcej niż jedną cyfrą.

(,)

-> to po prostu pasuje do przecinka ,

(.*)

-> i znowu: reszta linii

A teraz interesująca część:

echo "12$((3-1))45"
  • echo to polecenie bash
  • temu n (można użyć każdej wartości z 1 aż do 9) jest pewnego rodzaju "zmienna" dla wejść: 1 będzie zawierać pierwszy mecz, 2 sekundy meczu,...--> pomaga to zachować części ciąg wejściowy
  • temu $((1+1)) jest składni proste bash, aby obliczyć wartość termin wewnątrz podwójne nawiasy (w pełnej sed polecenia powyżej, 3 Oczywiście automatycznie zastąpi mecz o 3, tj.1-szej części wewnątrz nawiasów, aby uzyskać dostęp do tabeli "s komórek)
  • należy pamiętać, że używamy znaki cudzysłowu wokół zawartości echo do również być w stanie przetwarzać wiersze z znaki, takie jak & które w przeciwnym razie nie będzie działać

Wspomniany już e z ge na końcu spowoduje wykonanie wynik w bashu.Mionej pierwsze dwa wiersze kodu źródłowego w pytaniu przykład wywołałoby następujące instrukcje bash:

echo "void myFunction ("
echo "    &((int) table[$((1-1)), 0]),"

który jest wykonywany i powoduje następujące dane wyjściowe:

void myFunction (
&((int) table[0, 0]),

... co jest exatcly to, co chciałem :)

BTW: tekst > output.c jest prosty bash składni do wyjścia text (lub w tym przypadku sed-przetwarzania kodu źródłowego) w pliku o nazwie output.c.


Dobre linki na ten temat są:

Ahh i jeszcze jedno: można również użyć sed w git-Bash w systemie Windows - Jeśli są "zmuszeni" do korzystania z systemu Windows w pracy jak ja ;)

PS: W międzyczasie można łatwo zrobić to ręcznie, ale za pomocą sed było o wiele więcej zabawy ;)


1 dla odpowiedzi nr 2

Tutaj "s inny sposób można zrobić to za pomocą Perl:

perl -pe "s/(table[)(d+)(,)/$1.($2-1).$3/e" file.c

To wykorzystuje e modyfikator do wykonywania wyrażenia w wymiana. Przechwytywanie grupy są łączone, ale środek Grupa ma 1 odejmuje się od jego wartości.

To wyjście na standardowe wyjście, więc można sprawdzić, że robi to, co chcesz.Gdy użytkownik "re happy, możesz dodać -i przełącznika, aby zastąpić oryginalny plik.