Dla prostego usuwania znaków, które wykonujesz za pomocą tych sed
poleceń, 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 ( sed
jest 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 tr
polecenie robi wszystko, czego szukasz:
cat json_filename | tr -d "{}\" \012\011\015" | tr "," "\012"
Pierwsze tr
polecenie 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 tr
polecenie 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 sed
poleceń, z których każde działa niezależnie, ich połączenie można najłatwiej wykonać za pomocą opcji „-f” sed
do 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 sed
wymienione 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ś sed
ten plik poleceń za pomocą:
sed -f json.convert.sed
To powiedziawszy, te sed
polecenia nie działają dla mnie, aby osiągnąć to, czego chcesz, i nie jestem pewien, czy kiedykolwiek możesz sed
zmodyfikować znaki nowego wiersza. Wynika to z faktu, że sed
oparty 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ć sed
do 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'tr
tr
zrobi 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 sed
konwertują 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