sed를 사용하여 첫 번째 항목을 제외한 모든 항목을 주석 처리합니다.

sed를 사용하여 첫 번째 항목을 제외한 모든 항목을 주석 처리합니다.

첫 번째 이벤트를 제외한 다른 모든 이벤트를 주석 처리해 보았습니다.

원본샘플.txt

하나
#둘

샘플.txt

하나
#둘
##둘
#둘

나는 일어나는 모든 일에 대해서만 설명할 수 있습니다. 사용:

sed -i /two/s/^/#/

그러나 이는 이미 주석 처리된 이벤트도 주석 처리합니다. 또한 이벤트가 발견된 행을 주석으로 처리합니다. 이 문제를 어떻게 해결할 수 있나요? 우분투 기본 이미지에서 이것을 테스트 중이므로 특별히 아무것도 설치할 수 없습니다.

답변1

적어도 GNU sed(우분투에는 기본적으로 있어야 함)를 사용하면 0,/pattern/다음과 같은 작업을 수행할 수 있습니다.

$ sed '0,/^two/!s//#&/' original.txt 
one
two
three
#two
#two
#two

이것은 "0행과 첫 번째 일치 사이의 0행을 제외한 모든 행에 대해 /^two/로 바꾸고 방금 일치한 내용을 따릅니다. 교체의 빈 패턴은 이전 정규식과 일치하고 /^two/방금 일치한 내용을 대체합니다. 골프가 아닌 버전 ~ 할 것이다#//&

sed '0,/^two/!s/^two/#two/' original.txt

^two줄의 시작 부분에 고정되어 있으므로 주석이 달린 이벤트와 일치하지 않습니다 .아니요무엇을 원하시나요? 삭제하세요 ^.

답변2

perl -p -i -e '$_ = ("#" x $count{$_}++) . $_' your-file

예상한 결과를 만들어 보세요. 이전에 동일한 행이 발생한 수 만큼 각 행에 #접두어를 추가합니다.

위의 옵션은 -i파일을 편집합니다n-place ( -i일부 구현 sed에서 실제로 발견되는 옵션은 명백히 에서 복사되었습니다 perl).

답변3

sed그는 계산을 잘 못하기로 악명 높았습니다. 다음을 사용하는 것이 더 쉽습니다 awk.

$ awk '/^two/ { if (++count > 1) $0 = "#" $0 }; 1' file
one
two
three
#two
#two
#two

이렇게 하면 무시되는 줄을 처음 본 후 #문자열로 시작하는 각 줄 앞에 문자가 추가됩니다 . 그런 다음 수정 여부에 관계없이 모든 줄이 인쇄됩니다( two대체 가능한 코드의 꼬리를 통해 ).1{ print }

답변4

이것은 정확히 당신이 원하는 것은 아니지만, 내가 당신을 올바르게 이해한다면 당신은 주석 처리되지 않은 항목이 고유하고 다른 모든 항목이 주석 처리된 파일로 끝나기를 원할 것입니다. 이 작업을 어떻게 수행할지 모르겠지만 한 가지 해결 방법은 원본 파일을 그대로 유지하고 고유한 파일이 포함된 다른 파일을 만드는 것입니다.

$ cat sample.txt | uniq | grep -v ^#  
one
three
two

관련 정보