텍스트를 처리 할 때 두 줄마다 줄 바꿈 문자를 제거해야합니다.
샘플 텍스트:
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