다음을 사용하여 파일을 만들었습니다.
printf 'this is \n not is \n is is \n this biz' > file2
\n(newline)을 모두 제거하려고 하면 sed 자체에서 삽입한 숫자의 개행 문자만 제거됩니다.
sed '=' file2 | sed 'N; s/\n/ /'
출력은 다음과 같습니다
1 this is
2 not is
3 is is
4 this biz
내가 기대했던 것 대신에 :
1 this is 2 not is 3 is is 4 this biz
나는 그것을 알아낼 수 없다.
답변1
두 번째 sed
스크립트,
N
s/\n/ /
줄을 읽은 다음 명령으로 삽입된 새 줄이 포함된 해당 줄에 다음 줄을 추가한 다음 N
해당 줄 바꿈을 공백(및 출력)으로 바꾸기 때문에 예상한 대로 작동하지 않습니다. 후속 행을 읽으면 처음 두 행의 결과가 삭제됩니다.
대신 예약된 공간을 사용해야 합니다.
H; # append to hold space with a '\n' embedded
# for the last line:
${
x; # swap in the hold space
s/\n//; # delete the first newline (from the H command on the very first line of input)
y/\n/ /; # replace all other newlines with spaces
p; # print result
}
스크립트는 각 입력 줄에 대해 한 번씩 실행되어 마지막 줄에 도달할 때까지 예약된 공간에 데이터를 수집합니다. 마지막 줄에서는 수집된 데이터를 처리하여 출력합니다.
다음 명령을 사용하여 실행할 수 있습니다 sed -n
.
$ sed '=' <file2 | sed -n 'H; ${ x; s/\n//; y/\n/ /; p; }'
1 this is 2 not is 3 is is 4 this biz
(입력 끝에 개행 문자가 없기 때문에 출력 끝에 개행 문자도 없습니다.)
또는 명시적 루프를 사용하여 를 사용할 수 있습니다 N
. 여기서 중요한 점은 결과를 인쇄할 준비가 되기 전에 스크립트의 끝에 도달하지 않는 것입니다.
:top; # define label 'top'
N; # append next line with a '\n' embedded
$!btop; # if not at end, branch to 'top'
y/\n/ /; # replace all newlines with spaces
# (implicit print)
이 스크립트는 (끝까지) 한 번만 실행되고 데이터 자체 읽기를 관리하는 반면, 이전 스크립트는 내장된 읽기 루프를 통해 데이터를 제공했습니다 sed
(여기서패턴 공간 바꾸기이것은 읽는 모든 줄에 대한 문제입니다. 데이터를 수집하고 마지막 행을 읽을 때 처리하기 위해 홀드 공간 대신 패턴 공간을 사용합니다.
명령줄에서:
$ sed '=' <file2 | sed ':top; N; $!btop; y/\n/ /'
(위와 동일한 출력)
답변2
GNU라면 sed
이것을 시도해 보세요
$ sed -z 's/\n/ /g' file2
this is not is is is this biz
$
tr
잘하고 있습니다.
$ tr '\n' ' ' <file2
this is not is is is this biz
$
답변3
이는 근본적으로 sed
라인 지향적이기 때문이다. 무슨 일이 일어나는가?
- sed는 첫 번째 줄을
1
패턴 공간에 로드합니다. - 이
N
명령은 다음 줄을 로드하여 패턴 공간에 추가합니다\n
.1\nthis is
- 우리는
\n
대신 공간을 사용합니다1 this is
완료되었습니다. 패턴 공간을 인쇄하고 나머지 각 행(쌍으로)에 대해 이 단계를 반복합니다.
답변4
다음 명령을 사용해보십시오. 훌륭하게 작동합니다.
inputfile
this is
not is
is is
주문하다:
cat inputfile|sed "="| sed "N;s/\n/ /g"| sed "N;s/\n/ /g"| sed "N;s/\n/ /g"
산출
1 this is 2 not is 3 is is 4 this biz