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 :
- 통해 라벨을 만들
:a
- 패턴 공간에 현재와 다음 줄을 추가하십시오.
N
- 우리가 마지막 줄에 이전하는 경우, 생성 된 레이블 분기
$!ba
($!
마지막으로 줄 바꿈이 있어야 수단이 마지막 줄에 작업을 수행하는하지 (로)). - 마지막으로 대체는 모든 줄 바꿈을 패턴 공간 (전체 파일)에서 쉼표로 바꿉니다.
답변
이것은 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
패턴 공간을 채우기 직전에 후행 줄 바꿈을 항상 제거한 다음 스크립트 결과를 작성하기 전에 줄 바꿈을 추가합니다. \n
ewline은 다양한 방법으로 패턴 공간에서 가지게 될 수있다 – 그러나 편집의 결과하지 않을 경우. 이것은 중요합니다. 패턴 공간의 \n
줄거리는 sed
항상 변화를 반영하며 입력 스트림에서는 발생하지 않습니다. \n
ewlines는 sed
알 수없는 입력으로 믿을 수 있는 유일한 구분 기호 입니다.
모든 \n
ewlines를 쉼표로 바꾸고 파일이 크지 않은 경우 다음을 수행 할 수 있습니다.
sed 'H;1h;$!d;x;y/\n/,/'
즉에 대한 모든 입력 라인에 추가 h
하는 대신 덮어 쓰기하는 첫 번째를 제외하고 – 오래된 공간 h
후속 – 오래된 공간 \n
ewline 문자. 그런 다음 마지막 d
줄이 아닌 모든 줄 $!
을 출력에서 빼 냅니다. 마지막 줄에서 H
이전과 패턴 공간이 x
변경되고 모든 \n
ewline 문자가 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
.