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 ?
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 ?
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.
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. –
Có thể làm 'sed 's /.*/"&"/'' –
@glennjackman: Có. Nếu dòng trống, chỉ có một vị trí khi thay thế có thể được thử. – choroba
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).
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 –
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
tất cả các lý do khác để đi với 'awk' như tôi thấy nó: D – blue
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
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. –
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
@ 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. –
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
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
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.
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
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. –
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
$
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). –
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