PIPE 기호 사이의 여러 공백은 공백 없이 바꿔야 합니다.

PIPE 기호 사이의 여러 공백은 공백 없이 바꿔야 합니다.

파이프로 구분된 파일이 있는 경우:

1|123|A |Normal Behaviour Exhibit 
2|345|B|Embedded|delimiter  
3|678|D|dimension 1"
4| |   | | nvalue
5| | | |Missing cvalue

| | 모든 항목 을 대체하려면 sed 또는 awk와 같은 Unix 도구를 사용해야 합니다 ||. |위의 4행에 표시된 것처럼 기호 사이에 공백이 여러 개 있을 수 있습니다 .

예상 출력:

1|123|A |Normal Behaviour Exhibit 
2|345|B|Embedded|delimiter  
3|678|D|dimension 1"
4|||| nvalue
5||||Missing cvalue

다음 명령을 사용해 보았지만 sed예상한 결과를 얻지 못했습니다.

sed 's/| *|/||/g' S.txt > S1.txt

1|123|A |Normal Behavior Exhibit  
2|345|B|Embedded|delimiter  
3|678|D|dimension 1"
4||   || nvalue
5|| ||Missing cvalue
 

답변1

아무 sed나 사용하세요:

$ sed 's/|  *|/||/g; s/|  *|/||/g' file
1|123|A |Normal Behaviour Exhibit
2|345|B|Embedded|delimiter
3|678|D|dimension 1"
4|||| nvalue
5||||Missing cvalue

또는 awk를 사용하십시오.

$ awk '{while( sub(/\| +\|/,"||") );} 1' file
1|123|A |Normal Behaviour Exhibit
2|345|B|Embedded|delimiter
3|678|D|dimension 1"
4|||| nvalue
5||||Missing cvalue

답변2

를 사용하면 예측 정규식 연산자를 사용 하여 뒤에 오는 경우 모두 를 로 perl바꿀 수 있습니다 .|<spaces>||(?=...)

perl -pe 's/\| +(?=\|)/|/g' your-file

perln개 위치에서 편집 -i할 수 있는 옵션 도 있습니다 .i

답변3

사용 awk:

awk 'BEGIN{OFS=FS="|"}{for (i=1; i<=NF; i++) if ($i ~ /^ +$/) $i=""}1' file
1|123|A |Normal Behaviour Exhibit 
2|345|B|Embedded|delimiter  
3|678|D|dimension 1"
4|||| nvalue
5||||Missing cvalue

답변4

첫 번째 일치는 끝이 두 번째 일치의 일부가 되어야 하는 파이프를 소비합니다.

수정자를 사용하는 대신 더 이상 일치하는 항목이 없을 때까지 대체 항목을 반복합니다 g.

sed -e ': loop' -e 's/|  *|/||/' -e 't loop'

패턴에 두 개의 공백을 사용했기 때문에 ||일치하는 항목이 없습니다.

관련 정보