Для простого удаления символов, которое вы выполняете в этих командах 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
преобразует все символы% в пары символов ";".)