sed가 줄 바꾸기 문자를 대체 할 수 있습니까? aaaaa bbbbb ccccc ddddd 다음은

sed 및 new line character에 문제가 있습니까?
다음 내용의 test.txt 파일이 있습니다.

aaaaa
bbbbb
ccccc
ddddd

다음은 작동하지 않습니다.
sed -r -i 's/\n/,/g' test.txt

나는 tr이것을 사용할 수 있지만 내 질문은 sed로는 불가능한 것 같습니다.

이것이 파일을 한 줄씩 처리하는 부작용이라면 이것이 왜 발생하는지에 관심이 있습니다. 나는 grep새로운 줄을 제거 한다고 생각 합니다. sed도 마찬가지입니까?



답변

GNU sed에서 제공하고 제공 POSIXLY_CORRECT되지 않은 환경 (단일 라인 입력) :

sed -i ':a;N;$!ba;s/\n/,/g' test.txt

에서 https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n :

  1. 통해 라벨을 만들 :a
  2. 패턴 공간에 현재와 다음 줄을 추가하십시오. N
  3. 우리가 마지막 줄에 이전하는 경우, 생성 된 레이블 분기 $!ba( $!마지막으로 줄 바꿈이 있어야 수단이 마지막 줄에 작업을 수행하는하지 (로)).
  4. 마지막으로 대체는 모든 줄 바꿈을 패턴 공간 (전체 파일)에서 쉼표로 바꿉니다.

답변

이것은 GNU와 함께 작동합니다 sed:

sed -z 's/\n/,/g'

-z 4.2.2부터 포함

NB. -z분리 문자를 널 문자 ( \0) 로 변경합니다 . 입력에 널 문자가 포함되지 않은 경우 전체 입력이 단일 행으로 처리됩니다. 이것에는 한계가 있습니다.

마지막 줄의 줄 바꿈을 바꾸지 않으려면 다시 바꿉니다.

sed -z 's/\n/,/g;s/,$/\n/'

(GNU sed구문은 다시 한 번 말하지만 전체가 GNU에만 해당되므로 중요하지 않습니다)


답변

오라클 웹 사이트에서 :

sed 유틸리티는 파일을 한 줄씩 순차적으로 메모리로 읽어들입니다. 그런 다음 회선에 지정된 모든 조치를 수행하고 회선을 메모리에 다시 배치하여 요청 된 변경 사항이있는 단말기로 덤프합니다. 모든 작업이이 한 줄에 수행 된 후 파일의 다음 줄을 읽고 파일이 끝날 때까지 프로세스를 반복합니다.

기본적으로 이것은 sed가 한 줄씩 읽고 있기 때문에 줄 바꿈 문자가 일치하지 않음을 의미합니다.

https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n 의 솔루션 은 다음과 같습니다.

sed ':a;N;$!ba;s/\n/,/g'

또는 휴대용 버전 ( ;점프 마크 레이블 뒤에 연결 되지 않은 상태 )

sed -e ':a' -e 'N;$!ba' -e 's/\n/,/g'

작동 방식에 대한 설명은 해당 페이지에서 제공됩니다.


답변

sed\n패턴 공간을 채우기 직전에 후행 줄 바꿈을 항상 제거한 다음 스크립트 결과를 작성하기 전에 줄 바꿈을 추가합니다. \newline은 다양한 방법으로 패턴 공간에서 가지게 될 수있다 – 그러나 편집의 결과하지 않을 경우. 이것은 중요합니다. 패턴 공간의 \n줄거리는 sed항상 변화를 반영하며 입력 스트림에서는 발생하지 않습니다. \newlines는 sed알 수없는 입력으로 믿을 수 있는 유일한 구분 기호 입니다.

모든 \newlines를 쉼표로 바꾸고 파일이 크지 않은 경우 다음을 수행 할 수 있습니다.

sed 'H;1h;$!d;x;y/\n/,/'

즉에 대한 모든 입력 라인에 추가 h하는 대신 덮어 쓰기하는 첫 번째를 제외하고 – 오래된 공간 h후속 – 오래된 공간 \newline 문자. 그런 다음 마지막 d줄이 아닌 모든 줄 $!을 출력에서 빼 냅니다. 마지막 줄에서 H이전과 패턴 공간이 x변경되고 모든 \newline 문자가 y///쉼표로 변환됩니다.

큰 파일의 경우 이러한 종류의 문제는 sed라인 경계의 버퍼 인 문제를 유발할 수 있으며, 이러한 종류의 동작으로 쉽게 오버플로 될 수 있습니다.


답변

또는 약간 더 간단한 구문을 사용할 수 있습니다.

sed ':a;N;s/\n/,/g;ba'

… 순서 변경 순서 만.


답변

여기에 아주 좋은 sed 마술이 있습니다. 그리고 패턴 공간 오버플로에 대해 몇 가지 좋은 점이 제기되었습니다. sed 는 가장 간단한 방법이 아니더라도 매우 작고 강력하기 때문에 sed 를 사용하는 것을 좋아합니다 . 그러나 한계가 있으며 많은 양의 데이터의 경우 패턴 공간이 어마 어마해야합니다.

GNU는 이렇게 말합니다.

이식 가능한 sed 스크립트를 작성하려는 사용자의 경우, 일부 구현은 패턴 길이 및 보류 공간에 대한 행 길이를 4000 바이트 이하로 제한하는 것으로 알려져 있습니다. posix 표준은 적합한 sed 구현이 최소 8192 바이트 라인 길이를 지원하도록 지정합니다. GNU sed에는 줄 길이에 대한 제한이 없습니다. malloc () 더 많은 (가상) 메모리를 사용할 수있는 한 원하는만큼 줄을 공급하거나 구성 할 수 있습니다.

그러나 재귀는 하위 패턴과 무한 반복을 처리하는 데 사용됩니다. 이는 사용 가능한 스택 공간이 특정 패턴으로 처리 할 수있는 버퍼 크기를 제한 할 수 있음을 의미합니다.

추가 할 내용이 많지 않지만 sed에 대한 안내로 향하고 싶습니다 . 훌륭합니다.
http://www.grymoire.com/Unix/Sed.html

그리고 여기 내 해결책이 있습니다 :

for i in $(cat test.txt); do echo -n $i','; done; echo '' >> somewhere

잘 작동합니다


답변

개행을로 바꾸고 싶다고 가정 해 봅시다 \n. 나는 그것을하고 싶었으므로 여기에 내가 한 일이 있습니다.

(echo foo; echo bar; echo baz) | sed -r '$!s/$/\\n/' | tr -d '\n'
# Output: foo\nbar\nbaz

마지막 동작을 제외한 모든 행에 대해 append를 추가하십시오 \n. 그런 다음로 줄 바꿈을 삭제하십시오 tr.