Đối với việc xóa ký tự đơn giản mà bạn đang thực hiện trong các sed
lệnh này, thay vào đó tôi sẽ khuyên bạn nên sử dụng tr
, với mục đích duy nhất là xóa, ép hoặc thay thế các ký tự riêng lẻ, bao gồm các dòng mới ( sed
dựa trên regex, thường dựa vào dòng mới làm dấu tách bộ đệm, vì vậy sử dụng sed để sửa đổi các dòng mới là khó khăn). Tôi nghĩ tr
lệnh này thực hiện mọi thứ bạn đang tìm kiếm:
cat json_filename | tr -d "{}\" \012\011\015" | tr "," "\012"
Đầu tiên tr
lệnh xóa niềng răng tất cả xoăn, hai dấu ngoặc kép, không gian, tự xuống dòng (bát phân 012, ascii 10), các tab (bát phân 011, ascii 9, và linefeed (bát phân 015, ascii 13) ký tự. Thứ hai tr
lệnh thay thế tất cả dấu phẩy với Vận chuyển trở lại. Miễn là tên và giá trị biến của tệp JSON của bạn không chứa dấu phẩy, các lệnh này sẽ cho phép bạn tránh cần một trình phân tích cú pháp JSON chuyên dụng.
Điều đó nói rằng, nếu bạn có một tập hợp các sed
lệnh mà mỗi lệnh hoạt động độc lập, việc kết hợp chúng có thể được thực hiện dễ dàng nhất bằng cách sử dụng sed
tùy chọn "-f" để đọc các lệnh riêng biệt từ một tệp. Bạn chỉ cần đặt các chuỗi s /.../.../ g vào một tệp, mỗi chuỗi trên một dòng riêng, sau đó chỉ định tên tệp đó sau tùy chọn "-f". Ví dụ: nếu ba sed
lệnh bạn liệt kê là thỏa đáng, bạn có thể đặt chúng vào một tệp có tên "json.convert.sed" chỉ đơn giản chứa điều này:
s/\"//g
s/\,/\n/g
s/\s//g
Sau đó, bạn sẽ gọi sed
với tệp lệnh này bằng cách sử dụng:
sed -f json.convert.sed
Điều đó nói rằng, các sed
lệnh này không hoạt động để tôi thực hiện những gì bạn muốn và tôi không chắc bạn có thể sed
sửa đổi các ký tự dòng mới. Điều này là do sed
dựa trên trình chỉnh sửa dòng "ed" cũ, được thiết kế để chỉnh sửa từng dòng một (phiên bản có thể sử dụng "tập lệnh" của nó), do đó, mỗi dòng đầu vào được "phân tích cú pháp" bằng cách sử dụng dòng mới làm dấu phân cách, sau đó dòng (không có dòng mới) được chuyển đến công cụ chỉnh sửa, các lệnh chỉnh sửa được áp dụng, sau đó dòng được chỉnh sửa được xuất với dòng mới. Sau đó vòng lặp lặp lại. Tôi chỉ có thể sử dụng sed
để sửa đổi dòng mới bằng cách thay đổi dòng mới thành một số ký tự riêng biệt (không xuất hiện trong đầu vào) bằng cách sử dụng tr
. Cótr
tr
sẽ làm điều đó cho bạn. Nhưng nếu, chẳng hạn, bạn muốn chuyển đổi dòng mới thành dấu chấm phẩy có dấu cách, một cách để làm điều đó là:
cat input_file | tr "\012" "%" | sed "s/%/; /g"
(dòng mới được chuyển đổi thành% theo tr
, sau đó sed
chuyển đổi tất cả% ký tự thành các cặp ký tự ";".)
sed -i '' -e …
để có được nó ngay trên BSD. Nếu không, bạn sẽ có một tệp sao lưu đã lưu có têninput_file-e