/ / Zamień ciąg w skrypcie bash (MacOS) - macos, bash, sed

Zastąp ciąg w skrypcie basha (MacOS) - macos, bash, sed

Mam wygenerowany następujący kod w pliku Makefile:

    ${SED} -i "" -e "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles)
#   ${SED} -i "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles)

Które chcę zastąpić

#   ${SED} -i "" -e "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles)
${SED} -i "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles)

Jest to po prostu kwestia skomentowania jednej linii i zastąpienia jej drugą.

Ale ze względu na pojedyncze cytaty i podwójne cytaty nie mogę tego osiągnąć.

Jeśli jakiś ekspert ds. Wyrażeń regularnych zechce mi pomóc w ciągu 1-2 minut to będzie świetne.

Wyciągam tutaj włosy.

Dzięki

Odpowiedzi:

1 dla odpowiedzi № 1
# Comment out 1st line.
sed -E "s`([[:space:]]*${SED} -i """""" -e "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles))`#1`" Makefile
# Uncomment 2nd line.
sed -E "s`#([[:space:]]+${SED} -i "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles))`1`" Makefile

The sed polecenia są napisane w cudzysłowie, które są na ogół łatwiejsze w użyciu (nie musisz się martwić, że powłoka rozszerzy swój ciąg).

Trudny aspekt pierwszego polecenia jest takipojedynczych cudzysłowów nie można zawrzeć w ciągu pojedynczego cudzysłowu (nawet ucieczka nie jest opcją), więc polecenie jest po prostu podzielone na dwa ciągi pojedynczego cudzysłowu z """" - w wysokości "" - wklejono.

Innym trudnym aspektem jest uzyskanie ucieczki wszystkich specjalnych znaków regex. dobrze.