2013-01-20 15 views
7

tôi muốn làm thay thế cho các mẫu sau (quy tắc nói trên có ưu tiên cao hơn)làm thế nào để sử dụng sed thay thế mô hình chuỗi với dấu chéo ngược

\right) -> remain unchanged 
\right) -> remain unchanged 
\right] -> remain unchanged 
\right ] -> remain unchanged 
\right} -> remain unchanged 
\right } -> remain unchanged 
\ri)  -> \right) 
\ri  -> \rightarrow 
\right -> \rightarrow 

Nói cách khác, nếu có bất kỳ dấu ngoặc khung hoặc nẹp, tôi muốn có \ right, nếu có gì khác, nó phải được thay thế bằng \ rightarrow. Trong ngắn hạn, tôi đã cố gắng chuyển đổi rất nhiều phương trình google doc nhanh chóng với định dạng LaTeX thích hợp. Những gì tôi đã đưa ra là sau đây

sed -i 's/\\ri\([^g]\)/\\right\1/g' $tempfile1 #first step substitution 
sed -i 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' $tempfile1 
sed -i 's/\\right \([^])}>|a]\)/\\rightarrow \1/g' $tempfile1 

Nó hoạt động ok ngoại trừ nó không thay đổi \ right \ thành \ rightarrow \ như mong đợi. My tempfile1 kiểm tra đầu vào là như sau

\ri\right\right \right)\right]\right }\right)\ri \right ]\righta \al \\ 

Nó đi vào

\rightarrow\right\rightarrow \right)\right]\right }\right)\rightarrow \right ]\rightarrow \alpha \\ 

Ghi nhận rằng \ right \ phần đã không được thực hiện một cách chính xác. Sau đó, tôi thêm vào dòng sau, nghĩ rằng nó sẽ rõ ràng nhặt những gì còn lại, tuy nhiên, nó không hoạt động như mong đợi và bây giờ tôi thực sự bối rối ...

sed -i 's/\\right\\/\\rightarrow\\/g' $tempfile1 #why this does not work 

Cảm ơn rất nhiều trước!

+0

Nó làm việc cho tôi. – aragaer

+0

Chắc chắn bạn có thể kết hợp 3 tập lệnh của mình thành một tập lệnh bằng cách sử dụng 'sed -i -e '... pattern1 ...' -e '... pattern2 ...' -e '... pattern3 ...' .. .'. Đối với các tệp có kích thước kilobyte, ba lần truy cập có thể không quan trọng lắm, nhưng đối với các tệp nhiều megabyte và lớn hơn, một lượt vượt qua so với ba có thể tạo ra sự khác biệt lớn. –

+0

Tôi hiểu rồi, thx. Kích thước tệp thông thường cho tôi nhỏ hơn 50K (tài liệu LaTeX bình thường), nhưng tôi có 30 mẫu (ví dụ: \ al \ beta \ del \ b \ i \ sig) để thay thế và số lượng tăng lên theo thời gian. (Cảm ơn google doc cho trình soạn thảo phương trình của nó và "cải tiến" gần đây mà họ đã thực hiện) – gamebm

Trả lời

3

Vấn đề xảy ra khi các biểu hiện:

sed -i 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' 

được áp dụng cho:

\right\right\ 

Trận đấu đầu tiên đọc \right\ và thay thế nó bằng \rightarrow\; vấn đề xảy ra khi quét tiếp tục, nó bắt đầu tại r của right thứ hai, không phải với dấu gạch chéo ngược (đó là một phần của trận đấu trước đó).

Bí quyết đơn giản là để lặp lại các lệnh ...

sed -i -e 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' \ 
     -e 's/\\right\([^])}>|a]\)/\\rightarrow\1/g' 

Các giao dịch rescan với chuỗi \right\ thứ hai bằng cách bắt đầu ab initio một lần nữa.

+0

Cảm ơn rất nhiều vì đã giải thích, giờ tôi nghĩ tôi hiểu rõ hơn. Trong vấn đề thực sự của tôi, tôi thực sự có hơn 30 mẫu, vì vậy tôi sẽ chỉ đơn giản là lặp lại toàn bộ kịch bản một lần nữa. – gamebm

+1

Điều đó có thể hoạt động tốt. Ngoài ra, bạn có thể sử dụng Perl hoặc Python thay vì 'sed' và sử dụng ngữ cảnh cuối trong các mẫu để dấu chéo ngược thứ hai trong' \ right \ 'không phải là một phần của khớp đầu tiên và lặp lại tiếp tục ở nơi bạn muốn. –

+0

Tôi phải nghiên cứu những điều đó, tôi biết rằng sed không giỏi thao túng tài liệu nhiều dòng, vì vậy tôi không thể xử lý chúng một cách chính xác, ví dụ: khi đã tìm thấy dấu \ (double backslach) tôi cần thêm \ n (dòng cuối cùng)) và một phần bổ sung & ở đầu dòng tiếp theo nếu chúng chưa có.(\ alpha \\\ beta đến \ alpha \ n & \ beta) Đây là cách sắp xếp phù hợp của mảng phương trình. Tôi biết perl nên dễ dàng xử lý này, nhưng có vẻ như nhiều cho sed. – gamebm