sed에서 특정 줄을 교체에서 제외

sed에서 특정 줄을 교체에서 제외

특정 줄을 제외한 일부 구두점을 제거하고 싶습니다. 예를 들어 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"으로 바꿉니다. 그런 다음 해당 행을 인쇄합니다.

관련 정보