우리는 다음과 같은 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*#/
선택적 선행 공백이 있는 경우 다음을 건너뜁니다 #
.