Mam plik konfiguracyjny w formacie JSON z następującym blokiem
"device" :
{
"name" : "MyPi",
"type" : "ws2801",
"output" : "/dev/spidev0.0",
"rate" : 250000,
"colorOrder" : "rgb"
},
Używam sed (nie w wersji GNU na OS X), aby zastąpić wartości ciągu wyrażeniem sed w następujący sposób: sed -i '' '1h;1!H;$!d;x;s#\("device" :[^}]*"colorOrder"[ ]*: \)"[^"]*"#\1"grb"#' hyperion.config.json
Teraz chcę zastąpić „wyjście”: wiersz z wynikiem ls /dev/tty.usbmodem*
za pomocą tego polecenia: sed -i '' -e '1h;1!H;$!d;x;s#\("device" :[^}]*"output"[ ]*: \)"[^"]*"#\1"$(ls /dev/tty.usbmodem*)"#' hyperion.config.json
jednak ls
nie jest wykonywany i dostaję "output" : "$(ls /dev/tty.usbmodem*)",
Próbowałem zastąpić pojedyncze cudzysłowy podwójnymi cudzysłowami, uciekając wewnątrz wyrażenia, które nie działało.
Jak więc mogę zastąpić wartość wyjścia (wewnątrz bloku „urządzenie”) wyjściem ls
dowództwo?
sed -i '' -e "1h;1!H;$!d;x;s#\(\"device\" :[^}]*\"output\"[ ]*: \)\"[^\"]*\"#\1\"$(ls /dev/tty.usbmodem*)\"#" hyperion.config.json
jest-bash: !H: event not found
. Z uciekającymi wykrzyknikami:sed -i '' -e "1h;1\!H;$\!d;x;s#\(\"device\" :[^}]*\"output\"[ ]*: \)\"[^\"]*\"#\1\"$(ls /dev/tty.usbmodem*)\"#" hyperion.config.json
:sed: 1: "1h;1\!H;$\!d;x;s#\("dev ...": invalid command code \
Odpowiedzi:
zastąp część (wewnątrz pojedynczych cudzysłowów)
przez
stąd opuszczenie pojedynczej części cytatu i wprowadzenie podwójnego cytatu dla polecenia, a następnie ponowne wprowadzenie pojedynczego cytatu.
źródło
/dev/tty.usbmodem*
pasuje do więcej niż jednego pliku (lub żadnego). Aby obsłużyć wiele meczów, potrzebujesz$(echo $(ls /dev/tty.usbmodem*))
. Ale nie widzę celuls
, chyba że ma kilka domyślnych opcji: z pewnością jest znacznie prostsze do zastąpienia"$(ls /dev/tty.usbmodem*)"
przez"/dev/tty.usbmodem*"
.Dodaj cytaty jak w poniższym przykładzie.
Zastąpić:
przez:
źródło