perl + 주석이 있는 줄을 무시하고 일치하는 단어가 있는 중복 줄을 제거합니다.

perl + 주석이 있는 줄을 무시하고 일치하는 단어가 있는 중복 줄을 제거합니다.

우리는 다음과 같은 Perl oneliner를 생성합니다. 일치하는 첫 번째 줄을 제외한 이중선을 제거하기 위해 구문의 두 번째 부분은 "#"으로 주석 처리된 줄을 무시하는 것입니다.

예:

# more /tmp/test

     # abra_kadabra

abra_kadabra
abra_kadabra


# perl -i -ne -e'next if /^#/; next if /abra_kadabra/ && ++$ok > 1; print' /tmp/test


# more /tmp/test

     # abra_kadabra

실제로 Perl 구문은 다음을 설정하더라도 주석 행을 무시하지 않습니다 next if /^#/1.

내 구문에 어떤 문제가 있는지 제안해 주세요.

예상 출력

# more /tmp/test

     # abra_kadabra

abra_kadabra

다른 예:

# more /tmp/test

     # abra_kadabra
#       abra_kadabra
abra_kadabra 1
abra_kadabra 2
abra_kadabra 3
abra_kadabra 4

예상 출력:

# more /tmp/test

     # abra_kadabra
#       abra_kadabra
abra_kadabra 1

답변1

next if /^#/; ...; print로 시작하는 줄이 #인쇄되지 않음을 나타냅니다.

여기 당신이 원하는

perl -i -ne 'next if !/^\s*#/ && /abra_kadabra/ && $count++; print' /tmp/test

이것이 당신이 원하는 것입니다아니요next주석 처리된 행을 유지하려면 해당 행을 호출하십시오.

sed지원되는 구현과 동일합니다 -i( -i ''FreeBSD 및 그 파생물 사용):

sed -i -e '/^[[:space:]]*#/b' -e '/abra_kadabra/!b' -e 'x;/./d;g' /tmp/test

우리는 어디에 사용하나요?예비 공간abra_kadabra우리가 전에 만난 적이 있는지 기억해 보세요 .

답변2

#줄의 시작 부분에만 일치하도록 고정했습니다 . 선행 공백 이후에도 "#"으로 시작하는 모든 줄을 건너뛰려면 다음이 필요합니다.

next if /^\s*#/

선택적 선행 공백이 있는 경우 다음을 건너뜁니다 #.

관련 정보