캐리지 리턴, LineFeed 및 Sed 동작

캐리지 리턴, LineFeed 및 Sed 동작

sed가 1)에서는 작동하지만 2)에서는 작동하지 않는 이유를 이해해야 합니다. 나에게 대체 솔루션을 게시하지 마십시오. 이 포럼에서 찾았습니다. 요점 1)과 2)와 관련하여 sed의 동작을 이해하면 됩니다.

1)sed -i s/\\r//g file.txt

od -c file.txt를 확인하면 sed가 성공적으로 삭제되었습니다.\r

2)sed -i s/\\n//g file.txt

od -c file.txt를 확인할 때 sed가 삭제되지 않았습니다.\n

내 질문은 그것이 포인트 2에 적용되지 않는 이유를 이해하는 것입니다. 대체 솔루션을 게시하지 마십시오. 내부 작동 방식을 이해하고 싶다면 바로 이것입니다!

답변1

~에서GNU sed 매뉴얼 - sed 작동 방식

sed는 각 입력 라인에 대해 다음 루프를 실행하여 작동합니다. 먼저 sed는 입력 스트림에서 라인을 읽습니다.후행 줄 바꿈을 제거하십시오.를 선택하고 패턴 공간에 배치합니다. 그런 다음 명령이 실행됩니다. 각 명령은 연관된 주소를 가질 수 있습니다. 주소는 조건부 코드이며 명령은 실행하기 전에 조건이 확인된 경우에만 실행됩니다.

스크립트 끝에 도달하면 -n 옵션을 사용하지 않는 한 패턴 공간의 내용이 출력 스트림에 인쇄됩니다.후행 줄 바꿈이 제거되면 다시 추가하십시오.. 그런 다음 다음 루프는 다음 입력 라인으로 시작됩니다.

~에서POSIX 사양(감사해요강철 드라이버링크용)

기본 작업에서 sed 루프는 입력 줄을 추가해야 합니다.종료 개행 문자 빼기, 패턴 공간을 입력합니다. 일반적으로 D 명령이 마지막 사이클을 종료하지 않는 한 패턴 공간은 비어 있습니다. 그런 다음 sed 유틸리티는 주소가 해당 패턴 공간을 선택하는 모든 명령을 순서대로 적용하고 스크립트 끝에서 패턴 공간을 표준 출력에 복사하고(-n이 지정된 경우 제외) 패턴 공간을 삭제해야 합니다. 패턴 공간이 표준 출력이나 명명된 파일에 쓸 때마다 sed는바로 뒤에 개행 문자가 옵니다..


너무 길어요.입력 레코드 구분 기호(기본적으로 개행)는 명령을 실행하기 전에 제거된 다음 레코드를 인쇄할 때 다시 추가됩니다.


그러나 특정 상황에서는 개행 문자를 조작할 수 있습니다. 몇 가지 예가 아래에 나와 있습니다.

$ # this would still not allow newline of second line to be manipulated
$ seq 5 | sed 'N; s/\n/ : /'
1 : 2
3 : 4
5

$ # here ASCII NUL is input record separator, so newline can be freely changed
$ seq 5 | sed -z 's/\n/ : /g'
1 : 2 : 3 : 4 : 5 :  

$ # default newline separator, so NUL character can be changed
$ printf 'foo\0baz\0xyz\0' | sed 's/\x0/-/g'
foo-baz-xyz-
$ # NUL character is separator, so it cannot be changed now
$ printf 'foo\0baz\0xyz\0' | sed -z 's/\x0/-/g' | cat -A
foo^@baz^@xyz^@

답변2

파일은 sed구분된 줄의 스트림입니다 \n. \n구분자라면 당연히 치환 처리가 불가능하다 .

관련 정보