Jak poprawnie wykonać polecenie i użyć jego wyniku w sed?

1

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?

Gamadril
źródło
Musisz zastąpić pojedyncze cudzysłowy podwójnymi cudzysłowami. Większość istniejących cudzysłowów jest zbędna, z wyjątkiem tych, które znajdują się w schemacie wyszukiwania, i powinny one zostać pominięte.
AFH
wynik 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 \
Gamadril

Odpowiedzi:

1

zastąp część (wewnątrz pojedynczych cudzysłowów)

$(ls /dev/tty.usbmodem*)

przez

'"$(ls /dev/tty.usbmodem*)"'

stąd opuszczenie pojedynczej części cytatu i wprowadzenie podwójnego cytatu dla polecenia, a następnie ponowne wprowadzenie pojedynczego cytatu.

meuh
źródło
Zamierzałem zaproponować to rozwiązanie, ale zawodzi, jeśli /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ę celu ls, chyba że ma kilka domyślnych opcji: z pewnością jest znacznie prostsze do zastąpienia "$(ls /dev/tty.usbmodem*)" przez "/dev/tty.usbmodem*".
AFH
1

Dodaj cytaty jak w poniższym przykładzie.

Zastąpić:

'xxx"$(ls /dev/tty.usbmodem*)"xxx'

przez:

'xxx"'"$(ls /dev/tty.usbmodem*)"'"xxx'
Sleafar
źródło