2013-02-22 39 views
6

Tôi có một kịch bản shell Unix mà làm như sau:kịch bản Unix gắn thêm^M ở cuối mỗi dòng

  1. tạo ra một bản sao lưu của một tập tin
  2. gắn thêm một số văn bản vào một tập tin

Bây giờ trong # 2 nếu tôi chèn một văn bản,^M được nối thêm vào tất cả các dòng của tập tin.

Ví dụ:

echo " a" >> /cust/vivek.txt 
echo " b" >> /cust/vivek.txt 

vi vivek.txt 
abc^M 
bcd^M 
a^M 
b^M 

Bất kỳ cách nào để tránh điều này?

Cảm ơn,

Vivek

+0

cho chúng tôi biết văn bản được nối thêm vào tập tin theo tập lệnh –

+3

Bạn có tạo tệp này trên máy Windows và sau đó chuyển tệp trên máy unix/linux không? Kết thúc dòng được diễn giải khác nhau trong môi trường MS-DOS và Linux/Unix. Trên MS-DOS, kết thúc dòng được chỉ định bởi ký tự dòng mới và trả về vận chuyển, trong khi trên Unix, nguồn cấp dữ liệu dòng mới cho biết kết thúc của dòng. Điều này gây ra^M ký tự, nếu bạn không cẩn thận về các chế độ chuyển giữa MS-DOS và Unix/Linux – Incognito

+0

tôi đã sao chép các tập tin cơ bản từ cửa sổ máy chỉ, bây giờ bất kỳ cách nào để giải quyết này? –

Trả lời

8

Tôi không chắc chắn như thế nào echo có thể sản xuất ^M nhân vật nhưng bạn có thể loại bỏ chúng bằng cách chạy dos2unix trong hồ sơ của bạn, như thế này:

dos2unix /cust/vivek.txt 
+0

Cảm ơn rất nhiều, dos2unix đã làm các trick –

+0

Không bao giờ biết về dos2unix, làm việc như một say mê cho tôi! Chúc mừng – ConMan

+1

'echo -e" \ r "' tạo ra như vậy –

2

tôi nghi ngờ đây có thể là một artifact của các thiết lập vi của bạn, chứ không phải nối.

cat -v -e filename 

chương trình? Lệnh này sẽ kết xuất tệp của bạn và đánh dấu các ký tự điều khiển để rõ ràng là những gì thực sự trong tệp của bạn. Xem thêm this Superuser question/answer set.

+0

-v = ký hiệu^và M-, ngoại trừ LFD và TAB; -E = hiển thị $ ở cuối mỗi dòng; -e = tương đương với -vE; Vì vậy, -v -e = -v -vE; Dự phòng? Chúng ta không nên sử dụng "-e" thay vì "-v -e"? –

3

^M là một vận chuyển trở lại, và thường được nhìn thấy khi file được sao chép từ Windows. Sử dụng:

od -xc filename 

nên cung cấp danh sách cấp thấp về nội dung tệp của bạn. Nếu tệp của bạn không đến từ Windows thì một khả năng khác là cài đặt đầu cuối của bạn không dịch đúng. Kiểm tra rằng biến môi trường TERM là chính xác.

Nếu tập tin đã đến từ Windows, sau đó sử dụng dos2unix hoặc sed 's/\r//' file > file.new

+0

Cảm ơn dos2unix đã giúp) –

2

^M là ký tự meta mà bước vào tập tin của bạn khi nó được sử dụng trong cửa sổ.

lệnh dos2unix có thể sửa lỗi này.

dos2unix <filename> 
Các vấn đề liên quan