Sử dụng sed để chuyển đổi dòng mới vào không gian


22

Giả sử tôi có một biến shell $stringchứa một số văn bản với một số dòng mới, ví dụ:

string="this
is 
a test"

Tôi muốn chuyển đổi chuỗi này thành một chuỗi mới new_stringtrong đó tất cả các ngắt dòng được chuyển đổi thành khoảng trắng:

new_string="this is a test"

Tôi đã thử:

print $string | sed 's/\n/ /g'

nhưng nó không hoạt động

Tôi cũng tự hỏi nếu có một cách để làm điều này bằng cách sử dụng perl -0777 's/\n/ /g'hoặc có thể là lệnh tr?


Câu trả lời:


32

Nếu bạn chỉ muốn xóa các dòng mới trong chuỗi, bạn không cần sử dụng sed. Bạn có thể sử dụng chỉ

$  echo "$string" | tr '\n' ' '

như những người khác đã chỉ.

Nhưng nếu bạn muốn chuyển đổi các dòng mới thành khoảng trắng trên một tệp bằng cách sử dụng sed, thì bạn có thể sử dụng:

$ sed -i ':a;N;$!ba;s/\n/\t/g' file_with_line_breaks

hoặc thậm chí awk:

$ awk '$1=$1' ORS=' ' file_with_line_breaks > new_file_with_spaces

1
spongelà một tiện ích hữu ích để ghi đè một tập tin đầu vào. Nó là một phần của gói moreutils... ví dụ. awk '$1=$1' ORS=' ' file |sponge file
Peter.O

@ferer Cảm ơn thông tin. Cài đặt moreutils...
pferor


4

Tuy nhiên, một lựa chọn khác sẽ là sử dụng xargs(ngoài ra, vắt nhiều khoảng trắng):

string="this
    is 
a    test"

printf "$string" | xargs   # this is a test

3

Echo bỏ qua khoảng trắng, vì vậy nó sẽ hoạt động:

new_string=`echo $string`

Vâng, nó sẽ hoạt động, nhưng có lẽ quá tốt. Nó sẽ thu gọn nhiều khoảng trắng thành một không gian duy nhất. Điều đó bao gồm chuyển đổi TAB sang không gian.
Peter.O

3

Nếu bạn đã có chuỗi như là một biến bash, ví dụ như chương trình của bạn, nó là vô nghĩa và lãng phí tài nguyên (và gõ hơn) để gọi sed, awk, printf, vv ... Bạn có thể chỉ cần sử dụng mở rộng biến bash :

string="${string//$'\n'/ }"

Bạn thậm chí không phải gán lại nó. Bạn có thể sử dụng mở rộng $stringnguyên trạng và không thay đổi.

printf "${string//$'\n'/ }" >file

3

Bạn cũng có thể thử lệnh awk này,

awk -v RS="" '{gsub (/\n/," ")}1' file

Thí dụ:

$ (echo This; echo is; echo a; echo test.) | awk -v RS="" '{gsub (/\n/," ")}1'
This is a test.

1
state=$(set +o)
set -f ; IFS='
'; set -- $string
unset IFS; string="$*"
eval "$state"

Điều này chuyển đổi bất kỳ chuỗi nào của một hoặc nhiều \nký tự ewline xảy ra trong biến shell $stringthành một <space>.


0

Bạn có thể sử dụng lệnh sed đơn giản

 $-sed ':loop;N;s/\n/ /g;t loop'
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.