Tại sao xargs dải trích dẫn từ đầu vào?


25

Tại sao xargs trích dẫn trích dẫn từ văn bản đầu vào?

Đây là một ví dụ đơn giản:

echo "/Place/='http://www.google.com'" | xargs echo

đầu ra

/Place/=http://www.google.com

Có cách nào để giải quyết vấn đề này không? (xargs -0 không giúp tôi)


1
xargscoi các trích dẫn và dấu gạch chéo ngược đặc biệt là một phần của thông số kỹ thuật . xargsThay vào đó, hãy đăng những gì bạn đang cố gắng thực hiện .
jw013

3
xargs -0làm việc cho tôi ở đây ... Tại sao nó không giúp bạn?
derobert

Câu trả lời:


10

Từ xargshướng dẫn:

Nếu bạn muốn một đối số đầu vào có chứa các khoảng trống hoặc các tab ngang, hãy đặt nó trong dấu ngoặc kép hoặc dấu nháy đơn. Nếu đối số chứa ký tự trích dẫn kép ( "), bạn phải đặt đối số trong dấu nháy đơn. Ngược lại, nếu đối số chứa dấu nháy đơn ( '), bạn phải đặt đối số trong dấu ngoặc kép. Bạn cũng có thể đặt dấu gạch chéo ngược ( \) phía trước ký tự để nói với xargs bỏ qua bất kỳ ý nghĩa đặc biệt nào mà ký tự có thể có (ví dụ: ký tự khoảng trắng hoặc dấu ngoặc kép).

Điều này có nghĩa là bạn có thể thoát dấu ngoặc kép nếu trích dẫn được trích dẫn:

$ echo "/Place/=\'http://www.google.com\'" | xargs echo
/Place/='http://www.google.com'

sẽ làm việc nhưng echo /Place/=\'http://www.google.com\' | xargs echosẽ không.


1
Không có gì chống lại việc bỏ phiếu nhưng một nhận xét về lý do sẽ giúp :-)
Matteo

3
Điều gì nếu bạn đang đầu vào đường ống? Nếu tôi có một tập lệnh xuất ra "/Place/='http://www.google.com'", làm thế nào tôi có thể thoát nó đúng cách?
Roger Filmyer 7/07/2015

1
@RogerFilmyer your_script | song song - shellquote | ...
Ole Tange

19

nếu bạn muốn xargsđể bỏ qua dấu ngoặc kép một trong những soultion tốt có thể được sử dụng xargscờ xargs -0

Trực tiếp từ trang Man CHỌN

TÙY CHỌN -0, - hoàn toàn

Các mục đầu vào được kết thúc bằng ký tự null thay vì khoảng trắng và dấu ngoặc kép và dấu gạch chéo ngược không đặc biệt (mọi ký tự được lấy theo nghĩa đen). Vô hiệu hóa kết thúc chuỗi tệp, được xử lý như bất kỳ đối số khác. Hữu ích khi các mục đầu vào có thể chứa khoảng trắng, dấu ngoặc kép hoặc dấu gạch chéo ngược. Tùy chọn GNU find -print0 tạo đầu vào phù hợp cho chế độ này.

Tôi đã kiểm tra trên hệ thống GNU để đặt dấu phân cách thành một giá trị cụ thể (như dòng mới) với -dtùy chọn (và không chỉ -0) cũng sẽ xargskhông xử lý các trích dẫn, v.v.

-bash-4.3$ { echo "a'b'c"; echo d; } | xargs -d$'\n' echo
a'b'c d
-bash-4.3$ rpm -qf "$(which xargs)"
findutils-4.6.0.0.99.11a05-alt1.x86_64
-bash-4.3$ { echo "a'b'c"; echo d; } | xargs echo
abc d
-bash-4.3$ 


7

Tôi đã tìm thấy một giải pháp khác trong trang web: chỉ định rõ ràng dấu phân cách là '\ n'. Điều này tắt xử lý đặc biệt cho dấu ngoặc kép:

--d Friiter = delim, -d delim

Các mục đầu vào được kết thúc bởi ký tự được chỉ định. Dấu phân cách được chỉ định có thể là một ký tự đơn, thoát ký tự kiểu C, chẳng hạn như \ n hoặc mã thoát bát phân hoặc thập lục phân. Mã thoát bát phân và thập lục phân được hiểu như đối với lệnh printf. Nhân vật đa nhân không được hỗ trợ. Khi xử lý đầu vào, dấu ngoặc kép và dấu gạch chéo ngược không đặc biệt; mỗi ký tự trong đầu vào được thực hiện theo nghĩa đen.

Vì thế,

echo "/Place/='http://www.google.com'" | xargs -d'\n' echo

đầu ra

/Place/='http://www.google.com'

Lưu ý rằng nó ngụ ý GNU xargshoặc tương thích
Stéphane Chazelas

Cũng lưu ý rằng nó cũng ngăn không gian và tab được nhận dạng là dấu phân cách (có thể cũng giống như trong trường hợp của OP).
Stéphane Chazelas

Balman đã đưa ra một giải pháp tương tự ( thực ra là @imz ) mặc dù của bạn có phần tốt hơn ở chỗ nó tránh sử dụng ksh93 $'...'toán tử trích dẫn không được tìm thấy trong mọi triển khai shell.
Stéphane Chazelas

4

Tôi tìm thấy một giải pháp khác ở đây /programming//a/17468560/1795821 gợi ý sử dụng sedđể thoát dấu ngoặc kép.

Ví dụ:

sh-3.2$ echo "/Place/='http://www.google.com'" | sed "s/\'/\\\'/g" | xargs echo
/Place/='http://www.google.com'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.