파이프로 구분된 파일이 있는 경우:
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
perl
n개 위치에서 편집 -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'
패턴에 두 개의 공백을 사용했기 때문에 ||
일치하는 항목이 없습니다.