특정 줄을 제외한 일부 구두점을 제거하고 싶습니다. 예를 들어 sed
이러한 , : { } [ ]
마커만 삭제하고 1, 4~7, 38, 39행은 삭제 하고 싶지 않습니다. 어떻게 이를 달성할 수 있나요?
답변1
블록 다음에 블록을 추가하여 교체에서 제외할 수 있습니다.
sed -e '1!{ 4,7!{ 38,39! s/[][,:{}]//g ;}' -e '}' file_in > file_out
예(짧게 유지하기 위해 다른 범위 사용):
$ printf 'line %s , : { } [ ]\n' {1..10} | sed -e '1!{ 4,6!{ 8,9! s/[][,:{}]//g ;}' -e '}'
line 1 , : { } [ ]
line 2
line 3
line 4 , : { } [ ]
line 5 , : { } [ ]
line 6 , : { } [ ]
line 7
line 8 , : { } [ ]
line 9 , : { } [ ]
line 10
답변2
b
한 가지 방법은 먼저 유지하려는 줄에서 명령을 사용하는 것입니다.
sed -e 1b -e 4,7b -e 38,39b -e 's/[][,:{}]//g'
또는:
sed '
1 b
4,7 b
38,39 b
s/[][,:{}]//g'
GNU 구현을 사용하여 sed
다음과 같이 작성할 수도 있습니다.
sed '1b;4,7b;38,39b;s/[][,:{}]//g'
답변3
Perl을 사용하면 행 범위를 사용하여 매우 낮은 우선순위 또는 연산자를 통해 선택을 해제할 수 있습니다.
$ perl -pe '1..1 or 4..7 or 38..39 or tr/][,:}{//d'
다른 방법:
perl -pe 'grep { $. == $_ } (1, 4..7, 38..39) or tr/[]{},://d'
답변4
awk로 이와 같은 것을 시도해 볼 수 있습니다
awk '{ if (NR !~ /^(1|[4-7]|38|39)$/) { gsub(/[,:\{\}\[\]]+/,"",$0) }; print }' your-file.txt
NR(행 번호가 1, 4 ~ 7, 38 또는 39와 일치하지 않는 경우 기호를 "None"으로 바꿉니다. 그런 다음 해당 행을 인쇄합니다.