N 줄마다 개행 제거

N 줄마다 개행 제거

텍스트를 처리할 때 두 줄마다 줄바꿈을 제거해야 합니다.

예시 텍스트:

this is line one
and this is line two
the third and the
fourth must be pasted too

원하는 출력:

this is line one and this is line two
the third and the fourth must be pasted too

루프 를 시도했지만 whilewhile 루프는 나쁜 습관입니다. tr이를 수행하기 위해 다른 명령을 사용할 수 있습니까 ?

답변1

paste(예를 들어 표준 POSIX 단순 유틸리티이기도 함 tr)이 도구입니다.

이 개행 문자를 공백 대신 공백으로 바꾸고 싶다고 가정해 보겠습니다.삭제됨샘플에 표시된 대로:

paste -d ' ' - - < file

또는:

paste -sd ' \n' file

정말로 제거하고 싶다면 ' '로 교체하세요.'\0'

3개 중 2개를 교체하려면:

paste -sd '  \n' file

3개 중 1개(두 번째부터 시작):

paste -sd '\n \n' file

등.

또 다른 이점 paste은 종료되지 않은 회선이 남지 않는다는 것입니다. 예를 들어 삭제하면모든파일에 개행 문자( tr -d '\n' < file또는 와 동일 tr '\n' ' ' < file)가 있으면 행이 개행 문자로 끝나야 하므로 전혀 줄이 없게 됩니다. 따라서 일반적 으로 유효한 텍스트에 필요한 후행 줄 바꿈을 추가하는 paste(예: paste -sd '\0' file또는 )을 사용하는 것이 더 좋습니다 .paste -sd ' ' file

답변2

현대적이다GNU sed

sed -rz 's/\n([^\n]*\n)/ \1/g' sample.text

그리고

awk '{getline line2;print $0, line2}' sample.text

답변3

sed이를 위해 다음과 같이 사용하십시오.

SHW@SHW:/tmp $ cat a
this is line one
and this is line two
the third and the
fourth must be pasted too

SHW@SHW:/tmp $ sed 'N;s/\n/ /' a -i

SHW@SHW:/tmp $ cat a
this is line one and this is line two
the third and the fourth must be pasted too

답변4

또 다른 방법은 다음을 사용하는 것입니다 xargs.

$ < txt xargs -d '\n' -n 2 echo
this is line one and this is line two
the third and the fourth must be pasted too

어디

$ cat txt
this is line one
and this is line two
the third and the
fourth must be pasted too

하지만 이 솔루션은 각 라인이 프로세스를 실행하기 때문에 다소 과잉입니다 echo. 따라서 장난감 예제와는 별도로 awk/sed 또는 유사한 기반 솔루션이 선호되어야 합니다.

관련 정보