여러 문자를 개행 문자로 바꾸기

여러 문자를 개행 문자로 바꾸기

다음과 같은 데이터가 포함된 파일이 있습니다.

0.5, 14, 14, 12, 1.000000736101224E-11, -- 0.5, 14, 14, 14, 9.999999999999996E-12,

개행 문자로 바꾸는 방법은 무엇 , --입니까?

나는 그것을 시도했지만 sed 's/,\ --/\n/'성공하지 못했습니다.

답변1

sed 명령 s///에서 개행을 강제하는 것은 까다로울 수 있습니다.

선행 및 후행 공백도 정리하고 싶다고 가정하면 --awk가 좋은 선택입니다.

$ awk -F' *-- *' -v OFS='\n' '{$1=$1}1' file
0.5, 14, 14, 12, 1.000000736101224E-11,
0.5, 14, 14, 14, 9.999999999999996E-12,

$1=$1현재 레코드를 다른 필드 구분 기호로 다시 작성하도록 하는 awk 관용어입니다.

답변2

GNU 사용 sed:

$ gsed 's/, -- /\n/' file
0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,

그러나 표준에서는 sed이 명령을 사용하여 줄 바꿈을 삽입하는 것을 허용하지 않지만 s예약된 공간에서 추가하면 다음과 같은 이점을 얻을 수 있습니다.다음에 추가패턴 공간의 개행 문자:

$ sed 'h;s/, -- .*//;G;s/\(\n\).*, -- /\1/' file
0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,

이는 패턴 공간(라인)을 예약된 공간에 복사한 h다음 "첫 번째 라인"만 남도록 마지막 비트를 제거합니다. 그런 다음 포함된 개행 문자를 구분 기호로 사용하여 원본 데이터의 복사본을 패턴 공간에 추가합니다 G. 개행 문자와 구분 기호로 취급하는 패턴 사이의 비트는 개행 문자로 대체되고 결과가 인쇄됩니다.

GNU를 사용하지 않는 사용자를 위해 이 작업을 수행하는 더 우아한 방법이 있을 수 있습니다 sed.

답변3

@glenn jackman과 @Kusalananda가 맞습니다. 대체 문자열에 개행 문자를 사용하는 요령이 있습니다 sed. 예, 이것은 GNU가 아닌 sed(BSD)입니다.

인수에 개행 문자가 포함되어 있으므로 -e 플래그의 인수 부분을 인용하는 것이 요령입니다. 트릭의 첫 번째 부분은 따옴표를 사용하면 -e 대체 플래그에 문자 그대로 개행 문자를 넣을 수 있다는 것입니다. 두 번째 부분은 그러한 개행 문자를 백슬래시로 이스케이프 처리해야 한다는 것입니다 sed. 스크립트 구문에서는 다음과 같습니다.

sed -Ee "s/, +-- +/\\
/" < test.txt

명령줄에( bash계속 프롬프트를 사용하여 >) 수동으로 입력하면 다음과 같습니다.

$ sed -Ee "s/, +-- +/\\
> /" < test.txt
0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,

sed는 백슬래시 이스케이프를 위해 문자열에서 개행 문자를 (문자 그대로?) 교체해야 하기 때문에 따옴표 내에서 이중 백슬래시는 단일 백슬래시로 변환됩니다. 이중 백슬래시가 없으면 다음과 같이 불평하는 것을 볼 수 있습니다.

$ sed -Ee "s/, +-- +/  
/" < test.txt
sed: 1: "s/, +-- +/
/
": unescaped newline inside substitute pattern

답변4

sed 명령을 사용하면 잘 작동합니다

주문하다

echo "0.5, 14, 14, 12, 1.000000736101224E-11, -- 0.5, 14, 14, 14, 9.999999999999996E-12,"| sed "s/, -- /\n/g" 

산출

0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,

관련 정보