Dla prostego usuwania znaków, które wykonujesz za pomocą tych sedpoleceń, poleciłbym zamiast tego użyć tr, którego jedynym celem jest usuwanie, wyciskanie lub zastępowanie pojedynczych znaków, w tym znaków nowej linii ( sedjest oparty na wyrażeniach regularnych, które zwykle polegają na znakach nowej linii jako separatorach buforowych, więc używanie sed do modyfikowania nowych linii jest trudne). Myślę, że to trpolecenie robi wszystko, czego szukasz:
cat json_filename | tr -d "{}\" \012\011\015" | tr "," "\012"
Pierwsze trpolecenie usuwa wszystkie nawiasy klamrowe, podwójne cudzysłowy, spacje, znaki powrotu karetki (ósemkowe 012, ascii 10), tabulatory (ósemkowe 011, ascii 9 i linefeed (ósemkowe 015, ascii 13). Drugie trpolecenie zastępuje wszystkie przecinki zwraca karetkę. Tak długo, jak nazwy zmiennych i wartości pliku JSON nie zawierają przecinków, polecenia te pozwoliłyby uniknąć potrzeby dedykowanego analizatora składni JSON.
To powiedziawszy, jeśli masz zestaw sedpoleceń, z których każde działa niezależnie, ich połączenie można najłatwiej wykonać za pomocą opcji „-f” seddo odczytania osobnych poleceń z pliku. Wystarczy umieścić ciągi s /.../.../ g w pliku, każdy ciąg w osobnym wierszu, a następnie podać nazwę pliku po opcji „-f”. Na przykład, jeśli trzy sedwymienione polecenia są zadowalające, możesz umieścić je w pliku o nazwie „json.convert.sed”, który po prostu zawiera:
s/\"//g
s/\,/\n/g
s/\s//g
Następnie wywołałbyś sedten plik poleceń za pomocą:
sed -f json.convert.sed
To powiedziawszy, te sedpolecenia nie działają dla mnie, aby osiągnąć to, czego chcesz, i nie jestem pewien, czy kiedykolwiek możesz sedzmodyfikować znaki nowego wiersza. Wynika to z faktu, że sedoparty jest na starym edytorze linii „ed”, przeznaczonym do edycji pojedynczych linii naraz (jego wersja obsługiwana przez „skrypt”), więc każdy wiersz danych wejściowych jest „analizowany” przy użyciu znaku nowej linii jako separatora, a następnie linia (bez nowej linii) jest przekazywana do silnika edycji, stosowane są polecenia edycji, a następnie edytowana linia jest wypisywana z nową linią. Następnie pętla się powtarza. Byłem w stanie tylko użyć seddo modyfikacji nowej linii, najpierw zmieniając nową linię na jakiś odrębny znak (który inaczej nie pojawia się na wejściu) przy użyciu tr. Tam'trtrzrobi to za ciebie. Ale jeśli na przykład chcesz przekonwertować znaki nowej linii na średniki ze spacją końcową, jednym ze sposobów jest:
cat input_file | tr "\012" "%" | sed "s/%/; /g"
( znaki nowej linii są konwertowane na% przez tr, a następnie sedkonwertują wszystkie% znaków na pary znaków „;”).
sed -i '' -e …aby zrobić to poprawnie na BSD. W przeciwnym razie zostanie zapisany plik kopii zapasowej o nazwieinput_file-e