development

sed-아직 주석 처리되지 않은 특정 문자열과 일치하는 행에 주석 달기

big-blog 2021. 1. 7. 20:35
반응형

sed-아직 주석 처리되지 않은 특정 문자열과 일치하는 행에 주석 달기


다음 테스트 파일이 있습니다.

AAA
BBB
CCC

다음 sed를 사용하여 BBB 라인을 주석 처리 할 수 ​​있습니다 .

# sed -e '/BBB/s/^/#/g' -i file

시작 부분에 #이없는 경우에만 줄을 주석 처리하고 싶습니다.

# sed -e '/^#/! /BBB/s/^/#/g' file

sed: -e expression #1, char 7: unknown command: `/'

어떻게 이것을 달성 할 수 있는가?


여러 줄이 없다고 가정하면 다음과 #같이 작동합니다.

sed -e '/BBB/ s/^#*/#/' -i file

참고 : 한 줄에 최대 하나의 대체를 수행하므로 / g가 필요하지 않습니다.


이 솔루션이 가장 잘 작동한다는 것을 알았습니다.

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

얼마나 많은 "#"기호가 있는지는 중요하지 않으며 다른 기호를 추가하지 않습니다. 검색하려는 패턴에 "#"이 포함되어 있지 않으면 줄의 시작 부분에 추가되고 후행 공백도 추가됩니다.

후행 공백을 원하지 않는 경우

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\1/' file

&패턴 공간의 전체 일치 부분을 참조 하는 특수 문자를 사용하는 또 다른 솔루션입니다 . 정규 표현식 그룹을 캡처하고 참조하는 것보다 조금 더 간단하고 깔끔합니다.

sed -i 's/^[^#]*BBB/#&/' file

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

이것은 키워드로 나를 위해 작동하지 않으며 *.sudo전혀 의견이 없습니다 ...

Ony 아래 구문이 작동합니다. sed -e '/sudo/ s/^#*/#/' file


실제로, 캐럿 기호는 이미 대괄호 안에있는 모든 것을 부정하고 검색에서 모든 해시 기호를 무시하므로 느낌표 (!)가 필요하지 않습니다. 이 예제는 저에게 효과적이었습니다.

sed -i '/[^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

참조 URL : https://stackoverflow.com/questions/17998763/sed-commenting-a-line-matching-a-specific-string-and-that-is-not-already-comme

반응형