sed를 사용하여 개행을 공백으로 변환


22

$string여러 줄 바꿈이있는 텍스트를 포함 하는 쉘 변수가 있다고 가정 해보십시오.

string="this
is 
a test"

이 문자열을 new_string모든 줄 바꿈이 공백으로 변환되는 새 문자열로 변환하고 싶습니다 .

new_string="this is a test"

나는 시도했다 :

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

그러나 그것은 작동하지 않았다

나는 또한 이것을 사용 perl -0777 's/\n/ /g'하거나 명령 을 수행하는 방법이 있는지 궁금합니다 tr.


답변:


32

문자열에서 줄 바꿈 만 제거하려면을 사용할 필요가 없습니다 sed. 그냥 사용할 수 있습니다

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

다른 사람들이 지적했듯이.

그러나를 사용하여 파일의 줄 바꿈을 공백으로 변환하려면 sed다음을 사용할 수 있습니다.

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

또는 심지어 awk:

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

1
sponge입력 파일을 덮어 쓰는 데 유용한 유틸리티입니다. 패키지의 일부입니다 moreutils... 예. awk '$1=$1' ORS=' ' file |sponge file
Peter.O

@ferer 정보 주셔서 감사합니다. 설치 moreutils...
pferor


4

또 다른 옵션은 사용하는 것입니다 xargs(또한 여러 공백을 쥐어 짜는 것).

string="this
    is 
a    test"

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

3

에코는 공백을 무시하므로 작동해야합니다.

new_string=`echo $string`

예, 작동 하지만 너무 잘 작동 합니다. 여러 공백을 단일 공백으로 축소합니다. 여기에는 TAB을 공백으로 변환하는 것이 포함됩니다.
Peter.O

3

이미 bash는 변수로 문자열이있는 경우, 귀하의 예에서 볼 수 있듯이, 전화를 무의미 및 자원 (더 입력)의 낭비 sed, awk, printf, 등 ... 당신은 그냥 사용할 수있는 bash는 변수 확장 :

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

다시 할당 할 필요조차 없습니다. 확장을있는 그대로 사용하고 $string변경하지 않은 채로 둘 수 있습니다 .

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

3

이 awk 명령을 시도해 볼 수도 있습니다.

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

예:

$ (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"

변환이 하나 개 이상의 임의의 순서 \n쉘 변수 발생 ewline 문자 $string하나에 <space>.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.