2011-11-10 28 views
7

Bằng văn bản mủ, thường có một tệp thư mục đôi khi chứa _, & hoặc $. Ví dụ: tên tạp chí "Nature Structural & Sinh học phân tử", tiêu đề bài viết "Ước tính chi phí phát triển thuốc mới: Nó thực sự là $ 802 triệu?" Và số lượng "suppl_2". Vì vậy, tôi cần chuyển đổi các ký hiệu này thành \_, \&\$ tương ứng, tức là thêm dấu gạch chéo ngược ở phía trước, để trình biên dịch cao su có thể xác định chính xác chúng. Tôi muốn sử dụng sed để thực hiện chuyển đổi. Vì vậy, tôi đã thử

sed 's/_/\_/' <bib.txt >new.txt 

nhưng new.txt được tạo chính xác giống với bib.txt. Tôi nghĩ rằng cần _\ để thoát, vì vậy tôi đã thử

nhưng không có hy vọng. Ai đó có thể giúp? Cảm ơn.

+0

Lời xin lỗi của tôi, tôi đã hiểu sai khi tôi đang chỉnh sửa. – rcollyer

+1

Nếu bạn đã có một số ký tự thoát, thì regex của bạn sẽ cần phải kiểm tra xem ký tự trước đó không phải là '\' hay không. –

Trả lời

12

Bạn đang gặp một số khó khăn do cách trình bao xử lý chuỗi. Dấu gạch chéo ngược cần phải được tăng gấp đôi:

sed 's/_/\\_/g' 

Lưu ý rằng tôi cũng đã thêm 'g' để cho biết rằng thay thế sẽ được áp dụng trên toàn cầu trên đường chứ không chỉ cho kết quả đầu tiên.

Để xử lý tất cả ba biểu tượng, sử dụng một lớp nhân vật:

sed 's/[_&$]/\\&/g' 

(. Các dấu trong văn bản thay thế là một nhân vật đặc biệt đề cập đến nội dung phù hợp, không phải là một nhân vật dấu và đen)

+0

Cảm ơn. Điều này cũng hoạt động. –

1

Bạn cần phải thoát khỏi \. Như thế này: sed 's/_/\\_/' new.txt.

Edit: Ngoài ra, để sửa đổi new.txt tại chỗ, bạn cần phải vượt qua sed các -i cờ:

sed -iBAK 's/_/\\_/' new.txt

1

Bạn cần phải thoát khỏi nó hai lần.

➜ 8080667 sed 's/_/\\_/' new.txt 
In writing latex, usually there is a bibliography file, which sometimes contains \_, &, or $. For example, the journal name "Nature Structural & Molecular Biology", the article title "Estimating The Cost Of New Drug Development: Is It Really $802 Million?", and the volume number "suppl_2". 
➜ 8080667 
3
sed 's/\([_&$]\)/\\\1/g' 

ví dụ

eu-we1:~/tmp# cat zzz 
bla__h&thisis&not the $$end 
eu-we1:~/tmp# sed 's/\([_&$]\)/\\\1/g' < zzz 
bla\_\_h\&thisis\&not the \$\$end 
eu-we1:~/tmp# 
+0

và không làm tại chỗ seds, u không bao giờ biết. do sed 's/\ ([_ & $] \)/\\\ 1/g' < src.tex > dst.tex – user237419

+0

Cảm ơn rất nhiều. Nó thật sự có hiệu quả. –

+0

u're welcome :) – user237419

Các vấn đề liên quan