2012-05-25 7 views
13

Tôi có một danh sách các từLàm cách nào để thêm dấu ngoặc kép vào một dòng có SED hoặc AWK?

name,id,3 

tôi cần phải có nó đôi trích dẫn như thế này

"name,id,3" 

Tôi đã thử sed 's /.*/ \ "& \"/g', có

"name,id,3 

Chỉ có một dấu nháy kép

tôi cũng đã thử awk {Print "\" "$ 1" \ ""}, với kết quả chính xác cùng Cần giúp đỡ

+1

Lệnh sed của bạn hoạt động trên máy tính. Bạn có thể bỏ qua dấu gạch chéo ngược trước dấu ngoặc kép vì chúng vô dụng trong một chuỗi trích dẫn đơn. – Scharron

+0

hmmm, vâng, điều này thật kỳ lạ. Tôi nhận được một báo giá gấp đôi như nhau. Tệp gốc của tôi là file.csv - có danh sách dài "tên, id, [[: num:]]". Tại sao nó không hoạt động? – minerals

+1

'g' là không cần thiết, nhưng nó không gây ra vấn đề của bạn. Nền tảng của bạn là gì? –

Trả lời

8

tập tin đầu vào của bạn có kí tự xuống dòng ở cuối dòng. Bạn cần sử dụng dos2unix trên tệp để xóa chúng. Hoặc bạn có thể làm điều này:

sed 's/\(.*\)\r/"\1"/g' 

đó sẽ loại bỏ các xe trở lại và thêm dấu ngoặc kép.

+0

hoạt động! – minerals

+0

giải pháp tuyệt vời! Bạn có thể đặt một số ánh sáng trên những gì \ r và "\ 1" đang làm ở đây? –

+0

@satch_boogie: '\ r' là trở về vận chuyển. '\ 1' là nội dung của việc chụp được thực hiện bởi các dấu ngoặc đơn (vì vậy trong trường hợp này, toàn bộ dòng trước khi trở về vận chuyển). Kết quả là trả về vận chuyển được loại bỏ và dấu ngoặc kép được thêm vào. Tôi nghĩ rằng 'g' (toàn cục) ở phần cuối là không cần thiết, nhưng câu trả lời của tôi đã bảo toàn nó khỏi câu hỏi của OP. Xem [this] (http://www.regular-expressions.info/brackets.html) để biết thêm thông tin về cách chụp nhóm. –

11

Sử dụng này để ống đầu vào của bạn thành:

sed 's/^/"/;s/$/"/' 

^ là neo cho sự khởi đầu dòng và $ neo cho cuối dòng. Với dòng sed, chúng tôi sẽ thay thế dòng bắt đầu và kết thúc dòng với số lần lượt là "".

Ví dụ:

$ echo -e "name,id,2\nname,id,3\nname,id,4"|sed 's/^/"/;s/$/"/' 
"name,id,2" 
"name,id,3" 
"name,id,4" 

mà không sed:

$ echo -e "name,id,2\nname,id,3\nname,id,4" 
name,id,2 
name,id,3 
name,id,4 

tập tin của bạn dường như có DOS kết thúc dòng. Đường ống qua số dos2unixtrước tiên.

Proof:

$ cat test.txt 
name,id,2 
name,id,3 
name,id,4 
$ sed 's/^/"/;s/$/"/' test.txt 
"name,id,2 
"name,id,3 
"name,id,4 
$ cat test.txt|dos2unix|sed 's/^/"/;s/$/"/' 
"name,id,2" 
"name,id,3" 
"name,id,4" 
+0

Tôi thích bạn biến thể, nhưng điều đó mang lại cho tôi chỉ "tên, id, 3 mà không có dấu ngoặc kép thứ hai Cố gắng sed 's/$ /" /', đầu ra là như nhau!"name, id, 3 Có sự cố với tệp này – minerals

+0

@ user1413424: bạn chính xác gọi điều này như thế nào? Với lệnh chính xác ở trên nó ** sẽ ** hoạt động. Câu hỏi là shell bạn đang sử dụng và cách bạn gọi nó, bởi vì một số ký tự đặc biệt (như '$') có thể bị nuốt chửng. – 0xC0000022L

+0

~/shared $ sed 's/^/"/; s/$ /" /' file.csv – minerals

7

Bạn có thể sử dụng awk thay vì sed như thế này:

line='name,id,3' 
echo $line | awk '{printf("\"%s\"\n", $0);}' 

HOẶC thậm chí tốt hơn là sử dụng BASH printf như thế này:

printf '"%s"\n' $line 
+2

Sử dụng sáng tạo 'printf'. +1! – 0xC0000022L

+0

cảm ơn bạn, có vẻ tốt – minerals

+0

Tôi có lệnh như thế này, nhưng tôi cần mỗi dòng đầu ra được đính kèm trong "". Làm thế nào để sửa đổi lệnh này? : awk '{for (i = 2; i <= NF; i ++) {printf ("% s", $ i); } printf ("\ n")} 'all.txt> result.txt – user3823859

3

Cách đơn giản nhất tôi đã tìm thấy là sử dụng HEX mã cho dấu ngoặc kép:

echo name,id,3 | awk '{print "\x22" $1 "\x22"}' 
"name,id,3"