개행 문자를 sed(a la tr)로 교체하세요. [중복]

개행 문자를 sed(a la tr)로 교체하세요. [중복]
echo "hi,my,name,is" | sed 's/,/\n/g' >out.txt

생산하다:

hi
my
name
is

그러나 반대로:

sed 's/\n/,/g' out.txt

생산하다:

hi
my
name
is

sed교체 작업을 취소하여 작업을 복원하는 것은 어떨까요 ?

답변1

노력하다:

$ sed 'H;1h;$!d;x; s/\n/,/g' out.txt
hi,my,name,is

기본적으로 sed는 한 번에 한 줄씩 읽고, 처리하고, 인쇄합니다. 단일 행에는 개행 문자가 없으므로 이 명령은 s/\n/,/g아무 작업도 수행하지 않습니다. 위에서 언급했듯이 해결책은 전체 파일을 한 번에 읽은 다음 를 실행하는 것입니다 s/\n/,/g.

이 명령은 H;1h;$!d;x전체 파일을 한 번에 읽습니다. 아마도 이것을 관용구로 생각하는 것이 가장 쉬울 것입니다. 정말 자세한 내용을 알고 싶다면:

  • H-공간을 예약하기 위해 현재 줄을 추가합니다.
  • 1h - 첫 번째 행인 경우 예약된 공간을 덮어씁니다.
  • $!d- 마지막 라인이 아닌 경우 패턴 공간을 제거하고 다음 라인으로 점프합니다.
  • x - 홀드 공간과 패턴 공간을 교환하여 전체 파일을 패턴 공간에 넣습니다.

대안: 앗

$ awk 'NR>1{printf ","} {printf "%s",$0} END{print""}' out.txt
hi,my,name,is

또는:

$ awk '{printf "%s%s",(NR==1?"":","),$0} END{print""}' out.txt
hi,my,name,is

답변2

GNU sed 사용

echo "hi,my,name,is" | sed 's/,/\n/g' | sed -z 's/\n/,/g'

관련 정보