2013-06-07 17 views
6

Tôi muốn đặt mỗi dòng trong dấu ngoặc kép, ví dụ như:Bash - làm thế nào để đưa từng dòng trong ngoặc kép

abcdefg 
hijklmn 
opqrst 

chuyển đổi để:

"abcdefg" 
"hijklmn" 
"opqrst" 

Làm thế nào để làm điều này trong kịch bản shell Bash ?

+1

Chào mừng bạn đến stack Overflow. Vui lòng đọc [FAQ] sớm. Câu hỏi của bạn không phải là xấu nhưng nó là mơ hồ, hoặc có thể chỉ là một chút không đầy đủ. Các dòng đến từ đâu - từ một tệp, hoặc một mảng các biến hoặc các dòng trong một biến duy nhất (hoặc ở một nơi khác)? Đầu ra cần phải đi đâu? Vào một biến, một mảng, một tập tin, ở một nơi khác? Các câu trả lời cho đến nay cho thấy một loạt các khả năng (và không bao gồm tất cả các kịch bản tôi đề cập đến). –

+0

Ngoài ra, rất nhiều người khủng khiếp dường như muốn làm điều này vì những lý do sai. Nếu bạn có một chương trình yêu cầu các đối số của nó nằm trong dấu ngoặc kép, như câu lệnh ví dụ './tool ​​', ví dụ câu" ", thì dấu ngoặc kép được tiêu thụ bởi hệ vỏ và không phải là một phần của chính dữ liệu đó. Nếu bạn có các giá trị đó trong các biến, các biến sẽ không chứa các dấu ngoặc kép, nhưng bạn cần báo giá nội suy; './tool" $ sentence1 "" $ sentence2 "' – tripleee

Trả lời

4

Sử dụng sed:

sed -e 's/^\|$/"/g' file 

Nhiều nỗ lực cần thiết nếu các tập tin chứa dòng rỗng.

+1

Tôi đã thử điều này và phát hiện ra rằng, vì một lý do nào đó, trên các dòng trống nó chỉ xuất ra một trích dẫn. –

+5

Có thể làm 'sed 's /.*/"&"/'' –

+1

@glennjackman: Có. Nếu dòng trống, chỉ có một vị trí khi thay thế có thể được thử. – choroba

17

Sử dụng awk

awk '{ print "\""$0"\""}' inputfile 

Sử dụng tinh khiết bash

while read FOO; do 
    echo -e "\"$FOO\"" 
done < inputfile 

nơi inputfile sẽ là một tập tin chứa các dòng mà không có dấu ngoặc kép.

Nếu tập tin của bạn có dòng sản phẩm nào, awk chắc chắn là con đường để đi:

awk 'NF { print "\""$0"\""}' inputfile 

NF nói awk để chỉ thực hiện lệnh in khi Số Fields là hơn không (dòng không phải là trống).

+0

cho giải pháp 'read', bạn cần' IFS = read -r FOO'. Nếu không, bạn sẽ mất khoảng trắng ở đầu dòng và dấu gạch chéo ngược-thoát của tôi bị mất –

+0

Hoặc mất 'FOO' và sử dụng tên' $ REPLY' tiềm ẩn. Chỉ cần làm 'trong khi đọc; làm printf '"% s" \ n' "$ REPLY"; thực hiện kojiro

+0

tất cả các lý do khác để đi với 'awk' như tôi thấy nó: D – blue

3

Tôi nghĩ rằng sed và awk là giải pháp tốt nhất nhưng nếu bạn muốn sử dụng chỉ vỏ ở đây là kịch bản nhỏ cho bạn.

#!/bin/bash 

chr="\"" 
file="file.txt" 
cp $file $file."_backup" 
while read -r line 
do 
echo "${chr}$line${chr}" 
done <$file > newfile 
mv newfile $file 
+0

nó sẽ được tốt đẹp để ít nhất cung cấp một số lời giải thích là lý do tại sao bạn cảm thấy điều này là không chính xác. –

+0

Khác với việc hiển thị cách xuất dấu ngoặc kép, nó không giải quyết chủ đề thêm dấu ngoặc kép cho văn bản có từ trước. – chepner

+0

@ chepner Tôi đã sửa đổi nhận xét của mình và cảm ơn vì đã cho tôi phản hồi để tôi có thể đóng góp hiệu quả hơn. –

3

này sed nên làm việc cho bỏ qua dòng sản phẩm nào cũng:

sed -i.bak 's/^..*$/"&"/' inFile 

hoặc

sed 's/^.\{1,\}$/"&"/' inFile 
0
paste -d\" /dev/null your-file /dev/null 

(không phải là đẹp nhất nhìn, nhưng có lẽ là nhanh nhất)

Bây giờ, nếu đầu vào có thể n dấu ngoặc kép, bạn có thể cần phải thoát khỏi chúng bằng dấu xồ nguợc (và sau đó thoát khỏi backslashes cũng) như:

sed 's/["\]/\\&/g; s/.*/"&"/' your-file 
4

tôi sử dụng lệnh sau:

xargs -I{lin} echo \"{lin}\" < your_filename 

Các xargs mất đầu vào tiêu chuẩn (chuyển hướng từ của bạn tập tin) và vượt qua một dòng một thời gian để {lin} giữ chỗ, và sau đó thực hiện lệnh tiếp theo, trong trường hợp này là echo với dấu ngoặc kép thoát kép.

Bạn có thể sử dụng tùy chọn -i của xargs để bỏ qua tên của placeholder, như thế này:

xargs -i echo \"{}\" < your_filename 

Trong cả hai trường hợp, IFS của bạn phải có ít giá trị mặc định hoặc với '\n' ít nhất.

+0

Hãy xem xét thêm, người ta có thể không thực sự cần phải lặp lại điều này, nhưng người ta có thể có dấu ngoặc kép cần thiết để làm các hoạt động khác trong kịch bản. Đối với tôi, tôi có thể chạy một lệnh: script-that-lists-files-per-line.py | xargs -I {lin} sudo chmod a + r {lin} – macetw

+0

Bạn nói đúng Ông Macetw, sai lầm của tôi không nói rõ ràng đó chỉ là một ví dụ lệnh. –

0

Tôi đã sử dụng sed với hai biểu thức để thay thế bắt đầu và kết thúc của dòng, vì trong trường hợp sử dụng cụ thể của tôi, tôi muốn đặt các thẻ HTML chỉ xung quanh các dòng có chứa các từ cụ thể.

Vì vậy, tôi đã tìm kiếm cho các dòng chứa các từ chứa trong bla biến bên trong file văn bản inputfile và thay thế beginnign với <P> và kết thúc với </P> (cũng thực sự tôi đã làm một số còn HTML gắn thẻ trong thật, nhưng điều này sẽ phục vụ tốt làm ví dụ)

Tương tự như:

$ bla=foo 
$ sed -e "/${bla}/s#^#<P>#" -e "/${bla}/s#\$#</P>#" inputfile 
<P>foo</P> 
bar 
$ 
Các vấn đề liên quan