Tách biểu thức SQL dài tại dấu phân cách
Bối cảnh
Tôi đang cố gắng nhập một kết xuất có một số dòng dài (8k + ký tự) bằng SQL * Plus, vì vậy tôi gặp lỗi SP2-0027: Input is too long (> 2499 characters). Đây là một giới hạn được mã hóa khó và không thể vượt qua.
Giải pháp mong đợi
Tôi muốn truyền dữ liệu đầu vào của mình bằng bash và chia dòng dài hơn chiều rộng dự kiến trên ,ký tự cuối cùng (dấu phẩy).
Vì vậy, tôi nên có một cái gì đó như
cat my_dump.sql | *magic_command* | sqlplus system/oracle@xe
Chi tiết
- Tôi biết rằng phiên bản mới hơn có thể chấp nhận các dòng lên đến 4999 ký tự nhưng tôi vẫn có các dòng dài hơn (
cat my_dump.sql | grep '.\{5000\}' | wc -l) - Cập nhật bãi chứa bằng tay là không thực sự khả thi
- Tôi đã cố gắng sử dụng
trnhưng điều này phân chia mọi dòng mà tôi không muốn - Tôi đã cố gắng sử dụng
fmtvàfoldnhưng nó không có vẻ là có thể sử dụng một dấu phân cách tùy chỉnh - Tôi hiện đang tìm kiếm
sednhưng dường như không thể tìm ra regexp sẽ "tìm thấy kết quả trùng khớp cuối cùng,trong 2500 ký tự đầu tiên nếu có hơn 2500 ký tự"
Trả lời
Hãy thử một cái gì đó như:
sed -re '/.{2500}/ s/.{,2500},/&\n/g'
Giải trình:
/.{2500}/nếu dòng chứa 2500 ký tự (hoặc nhiều hơn) ...s/.{,2500},/&\n/gthay thế lên đến 2500 ký tự theo sau bằng,cách thêm một dòng mới
Tôi sẽ không ngạc nhiên nếu điều này thay thế một số "," ...
Tôi sẽ tưởng tượng một cái gì đó giống như lệnh awk này sẽ hoạt động:
awk 'length > 2499 {gsub(/.{0,2498},/, "&\n")} 1'
Regex cho phép tối đa 2498 ký tự trước dấu phẩy, (vì vậy 2499 bao gồm cả dấu phẩy) và chèn một dòng mới sau dấu phẩy. (Tôi đã sử dụng 2499 vì thông báo lỗi đề cập đến số đó.)