Для простого видалення символів ви робите в них sed
Натомість я рекомендую вам використовувати команди tr
, єдиною метою якого є видалення, стискання або заміна окремих символів, включаючи нові рядки ( sed
базується на регулярних виразах, які зазвичай покладаються на нові рядки як роздільники буферів, тому використання sed для зміни нових рядків є складним). Я думаю, що це tr
команда робить все, що ви шукаєте:
cat json_filename | tr -d "{}\" \012\011\015" | tr "," "\012"
Перший tr
Команда видаляє всі фігурні фігурні дужки, подвійні лапки, пробіли, повернення каретки (вісімкові 012, ascii 10), табулятори (вісімкові 011, ascii 9 і рядки (вісімкові 015, ascii 13). tr
Команда замінить всі коми з поверненням каретки. До тих пір, поки ваші імена та значення змінних файлів JSON не містять коми, ці команди дозволять вам уникнути необхідності використання спеціального синтаксичного аналізу JSON.
Проте, якщо у вас є набір sed
Команди, які кожен працює незалежно, комбінуючи їх, можна найлегше виконати за допомогою "-f" sed
можливість прочитати окремі команди з файлу. Ви просто помістіть рядки s /.../.../ g у файл, кожен рядок у своєму рядку, потім вкажіть це ім'я файлу після опції "-f". Наприклад, якщо три sed
перелічені вами команди є задовільними, ви можете помістити їх у файл з ім'ям "json.convert.sed", який просто містить:
s/\"//g
s/\,/\n/g
s/\s//g
Тоді ви б викликали sed
з цим командним файлом, використовуючи:
sed -f json.convert.sed
Тим не менш, ці sed
Команди не працюють для мене, щоб виконати те, що ви хочете, і я не впевнений, що ви можете отримати sed
, щоб змінити символи нового рядка. Це відбувається тому sed
заснований на старому редакторі рядків "ed", призначеному для редагування одиничних рядків одночасно (його "сценарій-доступний варіант"), тому кожен рядок вхідних даних "розбирається" за допомогою рядків як розділювачів, потім рядка без нового рядка) передається в механізм редагування, застосовуються команди редагування, після чого редагована лінія виводиться з рядком нового рядка. Потім цикл повторюється. Я лише колись міг використовувати sed
щоб змінити новий рядок, спочатку змінивши рядки нового рядка на певний символ (який інакше не з'являється у вхідних даних), використовуючи tr
. Немає сенсу використовувати tr
таким чином, якщо все, що ви хочете зробити, видаліть нові рядки, оскільки tr
зробить це за вас. Але якщо, наприклад, ви хотіли б перетворити символи нового рядка на крапки з комою з кінцевим пробілом, можна було б так:
cat input_file | tr "\012" "%" | sed "s/%/; /g"
(нові рядки перетворюються на% на tr
, потім sed
перетворює всі символи% в пари символів ";".)