첫 번째 이벤트를 제외한 다른 모든 이벤트를 주석 처리해 보았습니다.
원본샘플.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