Sed để đảo ngược hai từ


8
echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\) \(.*\)/ \2 \1/'

Đầu ra tôi đang mong đợi là /usr/local/Axis2C AXIS2C_HOME=.

Tôi không thể tìm ra những gì tôi đang làm sai. :

Câu trả lời:


8

Câu trả lời tầm thường là "nhiều dấu gạch chéo ngược, ít khoảng trống hơn":

echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'

Nhưng câu trả lời rộng hơn là "chờ đã, bạn đang cố gắng làm gì?" Bạn có muốn các cặp khóa-giá trị được chia thành các biến hữu ích hay bạn thực sự chỉ đang cố gắng chuyển đầu vào thành cú pháp ngược để đưa nó vào một thứ khác?


1

Bạn có một không gian sai lầm sau =. Thử:

sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'

Sau đây cũng hoạt động và ngắn hơn một chút. \1sẽ là bất cứ điều gì trước khi đầu tiên/

sed 's|^\([^/]*\)\(/.*\)|\2 \1|'

0

Sed là tuyệt vời, nhưng Perl cũng có thể làm điều này và nó không yêu cầu rừng dấu gạch chéo ngược:

% echo "AXIS2C_HOME=/usr/local/Axis2C" | perl -pe 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
/usr/local/Axis2C AXIS2C_HOME=

Ngoài ra, bạn đã có toàn bộ sức mạnh của công cụ biểu thức chính quy, do đó bạn có thể thực hiện các mẫu phức tạp hơn nữa.


2
Bạn cũng có thể tránh rừng dấu gạch chéo ngược nếu bạn có một sedGNU sed hỗ trợ các biểu thức chính quy mở rộng:echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
Steven D

@Steven D: Khu rừng là bạn của tôi ... (ý định chơi chữ một nửa ... nửa còn lại là: Tôi nghĩ tôi sẽ lạc lõng khi không có họ :) ... nhưng tôi đang xem xét, bây giờ bạn đã đã đề cập -r ... (Tôi đã nghĩ về nó .. Tôi sẽ dính vào dấu gạch chéo ngược, nếu không tôi sẽ mất khả năng hiểu các tuyên bố
quyến rũ
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.