[unix] 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

while루프를 시도 했지만 while 루프는 나쁜 습관입니다. tr또는 다른 명령을 사용하여 수행 할 수 있습니까?



답변

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) 대신 사용 하는 것이 좋습니다 .


답변

현대의 GNU sed

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

그리고 awk

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


답변

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


답변

다른 방법은 다음을 사용하는 것입니다 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 또는 유사한 기반 솔루션이 선호됩니다.


답변

이것은 실제로 vim에서 매우 간단합니다. 모든 줄을 결합하려면 J명령을 사용한 다음 %norm명령을 사용하여 모든 줄에 동시에 적용하십시오. 예를 들어

:%norm J<CR>

(당신이 vim에 익숙하지 않은 경우, <CR>단지 enter를 의미합니다)

이것은 심지어 임의의 수의 라인을 결합시키는 효과가 있습니다. 예를 들어, 10 줄마다 합치면

:%norm 9J<CR>

vim이 불편하고 대화식 텍스트 편집기 대신 명령 행 도구로 사용하려는 경우 다음을 수행 할 수 있습니다.

vim myfile -c '%norm J' -c 'wq'


답변

$ awk '{printf "%s%s",$0,(NR%2?" ":"\n")}' sample.txt
this is line one and this is line two
the third and the fourth must be pasted too

그러면 $0줄 번호 NR,가 홀수인지 짝수 인지에 따라 각 줄 뒤에 공백이나 줄 바꿈 이 인쇄됩니다 .

이 표현 NR%2?" ":"\n"은 삼항 진술입니다. NR%2행 번호가 홀수이면 표현식 은 true (0이 아님)로 평가됩니다. 이 경우 삼항 식은 공백을 반환합니다. 그것이 거짓 (0)으로 평가되면, 개행이 리턴된다.

대안

의견에서 Costas가 제안한대로 :

$ awk '{ORS=(NR%2?" ":RS)}1' sample.txt
this is line one and this is line two
the third and the fourth must be pasted too

여기서 삼 항문 NR%2?" ":RS은 공백 또는 입력 레코드 구분 기호 ( RS, default = newline) 를 반환하는 데 사용됩니다 . 이 값은 출력 레코드 구분 기호에 할당됩니다 ORS. 1명령의 끝에 인쇄 – 더 – 레코드에 대한 AWK의 비밀 속기이다.


답변

일반 솔루션, 5필요한 라인 수로 교체

$ # eof to ensure last line has newline ending
$ seq 16 | perl -pe 's/\n/ / if ++$i%5 && !eof'
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16

$ # or just use pr
$ seq 16 | pr -5ats' '
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16