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.