Tôi rất bối rối với vô số tùy chọn của GNU sed, POSIX sedvà BSD sed. Làm cách nào để thay thế chữ \nbằng ký tự dòng mới bằng ba sedloại này?
foo\\nbarhay foo\\\nbar?
Tôi rất bối rối với vô số tùy chọn của GNU sed, POSIX sedvà BSD sed. Làm cách nào để thay thế chữ \nbằng ký tự dòng mới bằng ba sedloại này?
foo\\nbarhay foo\\\nbar?
Câu trả lời:
sed 's/\\n/\
/g'
Lưu ý dấu gạch chéo ngược ngay trước khi nhấn return trong chuỗi thay thế.
sedlệnh ban đầu trong Unix v7 vào năm 1979. Nơi duy nhất có thể không hoạt động sẽ là các triển khai tước bỏ POSIX sedgiống như một số ứng dụng dựa trên hộp bận bị loại bỏ. Điều đó sẽ không hoạt động trong csh nhưng đó là một vấn đề csh.
\\nđược sử dụng trong phần tìm kiếm, tại sao không sử dụng \ntrong phần thay thế? cái trước dường như ngụ ý cái sau tồn tại. I E. tại sao không phải thế này$ echo '1\n2'|sed 's/\\n/\n/g'
\nlà một nghĩa đen, ngụ ý rằng nó xuất hiện dưới dạng hai ký tự: abackslash theo sau n, và không phải là một ký tự dòng mới. Do đó, hai dấu gạch chéo ngược để tạo dấu gạch chéo ngược thành chữ và sau đón
Vì bạn đã có sedcâu trả lời di động của mình , tôi sẽ chỉ đề cập rằng đó sedhiếm khi là công cụ tốt nhất nếu bạn cần bằng cách nào đó thao tác các dòng mới. Perl rất gần như di động sed, được cài đặt theo mặc định trên hầu hết các hệ thống * nix và có thể giải quyết vấn đề này rất dễ dàng:
printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'
Một lựa chọn rất di động khác là awk:
printf '%s\n' 'aa\nbb' | awk '{gsub("\\\\n","\n")};1'
Trên Solaris, hãy nhớ sử dụng awk tiêu chuẩn trong / usr / xpg4 / bin, một trong / bin là một lịch sử và không nên được sử dụng cho các tập lệnh mới.
awkcó vấn đề về tính di động tương tự (Là awkđơn giản cũ của tôi awk, nawkhoặc gawk?). Trên thực tế, phiên bản trong hộp Solaris của tôi thiếu gsub(). Phiếu bầu của tôi ở đây là dành cho Perl ( perl -nlawe '...'xấp xỉ hành vi tự động của awk).
awktính di động, hãy awksử dụng phiên bản tuân thủ POSIX và chỉ sử dụng các tính năng đó và bạn sẽ ổn. Trên Solaris bạn sẽ tìm thấy một như /usr/xpg4/bin/awk.
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'sao?
gsub()sẽ hoạt động ở mọi nơi. Ngay cả busybox cũng có awk.
Nếu Holdspace trống, bạn cũng có thể làm:
sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'
... nhưng câu trả lời của uxnut đã nhanh hơn và đơn giản hơn, vì vậy bạn có thể thực hiện theo ý muốn.
Một khả năng ngoại lai khác:
INPUT | sed -n l | while read v ; do printf "${v%?}" ; done
Nhưng hãy cẩn thận, ^ dịch tất cả các \dấu gạch chéo ngược kiểu C tiêu chuẩn - như \backspace và \return \00và octals và whathaveyou.
Với gnu sedcác công việc sau đây:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Bạn cần một giải pháp trong sed, và điều đó đã được đưa ra dưới đây. Nhưng tôi muốn thêm một khả năng nữa là IMHO chỉ dễ dàng hơn và nhanh hơn,
tr -d "\n"