N 줄마다 줄 바꿈 문자를 제거하십시오.


16

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

샘플 텍스트:

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또는 다른 명령을 사용하여 수행 할 수 있습니까?


4
제목은 "모든 N 줄"이라고 말하지만 질문과 예에서는 "모든 2 줄"입니다. 대부분의 답변은 N = 2에 대해서만 작동합니다. 모든 N에 적합한 것을 찾고 있습니까?
JigglyNaga

이것이 핵심입니다. 모두가 2 줄로 답했지만 N = 3 또는 N = 4를 사용해야합니다.
jomaweb

답변:


24

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


11

현대의 GNU sed

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

그리고 awk

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

3
sed방법은 전체 파일을 메모리에 넣고 (NUL 바이트를 포함하지 않는 경우) 비싼 정규 표현식 대체를 수행하는 것을 의미합니다. 표준 sed 'N;s/\n/ /'접근법에 비해 이점을 볼 수 없습니다 .
Stéphane Chazelas

6

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 또는 유사한 기반 솔루션이 선호됩니다.


1
당신에 따라 echo구현, 당신은 또한 백 슬래시 문자 나로 시작하는 일부 라인에 문제가있을 것이다 -(같은 --help또는 -neneGNU와를 echo). 또한 -dGNU 확장입니다.
Stéphane Chazelas

와 관련된 문제를 피하기 위해 echo다음을 사용할 수 있습니다.< txt xargs -d '\n' -n 2 printf -- '%s %s\n'
nyuszika7h

4

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

:%norm J<CR>

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

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

:%norm 9J<CR>

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

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

downvoter가이 답변을 개선하기 위해 내가 할 수있는 일을 설명 할까?
DJMcMayhem

3
$ 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의 비밀 속기이다.


당신은 여전히 3 자 저장할 수 있습니다 다음 ()괄호 이후의 공간 printf)
maxschlepzig

1
세 개 한 벌? 오! 'NR%2{printf("%s ",$0);next}1'
Costas

maxschlepzig의 대답 : 및 원 문'{ORS=(NR%2?" ":RS)}1'
타스

@ 코스타스 나는 그것을 좋아한다. 답변이 ORS솔루션으로 업데이트되었습니다 .
John1024

2

일반 솔루션, 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

1

awk이것을 위해 사용할 수 있습니다 :

$ awk '{c="\n"} NR%2 {c=" "} { printf("%s%s", $0, c) } ' txt

다음을 생성합니다.

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

awk작업은 각 라인, 특별한 변수에 대한 실행 $0참조 현재 라인은, NR현재의 행 번호 (1부터 시작)입니다. 두 번째 동작은 NR%2모듈로 연산 인 표현식으로 보호됩니다 . 따라서 홀수 라인 번호에 해당하는 c=" "경우에만 실행됩니다 NR%2.

awk구문은 같은 C이지만, 일부 요소는 어떤 상황에서 선택 사항입니다 - 예를 들어, 세미콜론.


귀하의 c변수입니다 ORS:'NR%2{ORS=" "}1;{ORS=RS}'
타스

0

사용 ed:

$ cat text
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

$ ed text <<'END_ED'
g/./s/$/ /\
j
w text.new
END_ED
164
164

$ cat text.new
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

ed, 각 라인 (것이다 편집 명령 g지정된 정규 표현식과 일치하는 모든 행에 명령을 편집 세트를 적용)는, 마지막에 공백 문자를 추가하고 다음 라인으로 가입 할 수 있습니다. 그런 다음 결과 텍스트를이라는 파일에 씁니다 text.new.


0

루비와 함께.

n줄 블록을 결합 한다고 가정합니다 . n = 3입력 파일이 'infile'있고 결과가 파일에 기록 된다고 가정 하십시오 'outfile'.

파일 구성

Ruby -e "File.write 'infile', <<_
> Line 1
> Line 2
> Line 3
> Line 4
> Line 5
> Line 6
> Line 7
> _"

파일 내용 확인

ruby -e "p File.read 'infile'"
  # "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\n"

줄 바꿈을 제거하고 파일에 쓰기

ruby -e "File.write 'outfile', File.readlines('infile').
  each_with_index { |line,i| line.chomp! unless (i+1)%3==0 }"

내용 확인

ruby -e "puts File.read 'outfile'"
  # ["Line 1", "Line 2", "Line 3\n", "Line 4", "Line 5", "Line 6\n", "Line 7"]

1
좋아요 이론적 ruby으로 U & L에 대한 주제가 아닙니다. 그러나 명령 줄 ruby -e에서을 사용하기 때문에 주제에 충분합니다.
grochmal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.