Tôi rất bối rối với vô số tùy chọn của GNU sed
, POSIX sed
và BSD sed
. Làm cách nào để thay thế chữ \n
bằng ký tự dòng mới bằng ba sed
loại này?
foo\\nbar
hay foo\\\nbar
?
Tôi rất bối rối với vô số tùy chọn của GNU sed
, POSIX sed
và BSD sed
. Làm cách nào để thay thế chữ \n
bằng ký tự dòng mới bằng ba sed
loại này?
foo\\nbar
hay 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ế.
sed
lệ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 sed
giố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 \n
trong 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'
\n
là 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ó sed
câu trả lời di động của mình , tôi sẽ chỉ đề cập rằng đó sed
hiế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.
awk
có vấn đề về tính di động tương tự (Là awk
đơn giản cũ của tôi awk
, nawk
hoặ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
).
awk
tính di động, hãy awk
sử 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 H
oldspace 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ư \b
ackspace và \r
eturn \00
và octals và whathaveyou.
Với gnu sed
cá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"