![개행 문자를 sed(a la tr)로 교체하세요. [중복]](https://linux55.com/image/129206/%EA%B0%9C%ED%96%89%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20sed(a%20la%20tr)%EB%A1%9C%20%EA%B5%90%EC%B2%B4%ED%95%98%EC%84%B8%EC%9A%94.%20%5B%EC%A4%91%EB%B3%B5%5D.png)
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'