시작하는 단어를 기준으로 줄에 주석을 다는 방법은 무엇입니까?

시작하는 단어를 기준으로 줄에 주석을 다는 방법은 무엇입니까?

샘플 파일 내용:

--------------------
NETWORKING=yes
HOSTNAME=wls1.ebs-testsrvrs.com
# oracle-rdbms-server-12cR1-preinstall : Add NOZEROCONF=yes
NOZEROCONF=yes
--------------------

"HOST"로 시작하는 모든 줄을 주석 처리하고 싶습니다.

답변1

존재하다 vi:

:%s/^HOST/#&/

또는

:g/^HOST/s//#&/

첫 번째 명령은 %"전체 버퍼에서"를 의미하며, 줄여서 1,$첫 번째 줄부터 마지막 ​​줄까지를 의미합니다. &교체 섹션의 교체 내용은 ^HOST패턴( )과 일치하는 전체 텍스트로 교체됩니다.

두 번째 명령은 s///셀프 에디터를 상속한 전역( ) 명령을 사용하여 일치된 모든 행에 교체( )를 적용합니다. 두 번째 경우에는 명령이 빈 정규식을 사용합니다. 이렇게 하면 명령에서 가장 최근에 사용한 정규식을 재사용할 수 있습니다. 대체는 첫 번째 명령과 동일합니다.^HOSTgvieds///^HOSTg

그리고 sed:

sed 's/^HOST/#&/' input >output

또는

sed '/^HOST/s//#&/' input >output

viin ( 항상 입력 스트림의 모든 라인에 모든 명령을 적용하므로 이와 같은 것을 명시 적 sed으로 사용하지 않습니다 ) 와 같은 방식입니다 .%gsed


도착하다제거하다다음으로 시작하는 줄의 주석 문자 #HOST:

sed 's/^#HOST/HOST/' input >output

또는

sed '/^#HOST/s/.//' input >output

위의 두 명령 중 두 번째 s///명령은 로 시작하는 모든 줄에 명령이 적용됩니다 #HOST. 이 s///명령은 줄의 첫 번째 문자만 제거합니다.

vi이 두 명령에 해당하는 명령은 다음과 같습니다.

:%s/^#HOST/HOST/

그리고

:g/^#HOST/s/.//

각기

답변2

옵션과 함께 sed를 사용하여 -i파일을 제자리에서 편집하세요. (원본의 백업 복사본이 로 저장됩니다 file.txt.bak.) sed -i.bak 's/^\(HOST.*\)/#\1/g' file.txt

정규식 부분을 읽으십시오: ^줄의 시작 부분과 일치합니다.

()일치하는 텍스트를 임시 내부 변수( )로 가져옵니다 \1.

\문자 앞에 필요합니다. (그렇지 않으면 쉘이 문자를 훔칠 것이기 때문입니다.

.*0개 이상의 문자와 일치합니다 .

따라서 줄의 맨 앞에서 시작하여 HOST문자열과 개행 문자까지의 텍스트가 일치합니다. 행이 일치하지 않으면 그대로 두십시오. 일치하는 항목이 있으면 가 #\1인쇄 되고 #그 뒤에 텍스트가 표시 됩니다 ().

답변3

Perl 1 라이너:

perl -pe 's/^HOST/#$&/' file

또는 해당 위치에서 파일을 편집합니다.

perl -i -pe 's/^HOST/#$&/' file

설명하다

-pe방법주어진 스크립트를 적용한 후 각 입력 줄을 인쇄합니다 -e. 각 줄의 s/foo/bar/첫 번째 인스턴스를 대체 하는 대체 연산자입니다. 여기서는 (줄의 시작을 나타내는)로 시작하는 줄을 a와 일치하는 내용(일치하는 내용을 저장하는 특수 변수)으로 바꿉니다. 그래서 우리는 로 대체합니다.foobarHOST^#$&HOST#HOST

답변4

펄 한 줄:

$ perl -ne 'if(/^HOST/){print "#$_"} else { print}' input.txt                                  
--------------------
NETWORKING=yes
#HOSTNAME=wls1.ebs-testsrvrs.com
# oracle-rdbms-server-12cR1-preinstall : Add NOZEROCONF=yes
NOZEROCONF=yes
--------------------

이 간단한 한 줄짜리 줄은 모든 줄을 통과하여 줄이 다음으로 시작하여 HOST추가되는지 확인합니다. 그렇지 않으면 명령문 #으로 이동하여 변경되지 않은 줄만 인쇄합니다.else

동일한 내용의 Python 버전은 다음과 같습니다.

python -c "import sys;print '\n'.join([ '#' + l.strip() if l.startswith('HOST') else l.strip()  for l in sys.stdin  ])" < input.txt

그러나 행 목록(또는 배열)을 작성하고 조건에 따라 행 자체 또는 추가 행을 삽입하는 방식으로 약간 다르게 작동합니다 #. 결국 배열은 하나의 큰 문자열로 연결되고 항목은 줄 바꿈으로 구분되어 인쇄됩니다.

관련 정보