다음과 같은 데이터가 포함된 파일이 있습니다.
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,