샘플 파일 내용:
--------------------
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///
셀프 에디터를 상속한 전역( ) 명령을 사용하여 일치된 모든 행에 교체( )를 적용합니다. 두 번째 경우에는 명령이 빈 정규식을 사용합니다. 이렇게 하면 명령에서 가장 최근에 사용한 정규식을 재사용할 수 있습니다. 대체는 첫 번째 명령과 동일합니다.^HOST
g
vi
ed
s///
^HOST
g
그리고 sed
:
sed 's/^HOST/#&/' input >output
또는
sed '/^HOST/s//#&/' input >output
vi
in ( 항상 입력 스트림의 모든 라인에 모든 명령을 적용하므로 이와 같은 것을 명시 적 sed
으로 사용하지 않습니다 ) 와 같은 방식입니다 .%
g
sed
도착하다제거하다다음으로 시작하는 줄의 주석 문자 #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와 일치하는 내용(일치하는 내용을 저장하는 특수 변수)으로 바꿉니다. 그래서 우리는 로 대체합니다.foo
bar
HOST
^
#
$&
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
그러나 행 목록(또는 배열)을 작성하고 조건에 따라 행 자체 또는 추가 행을 삽입하는 방식으로 약간 다르게 작동합니다 #
. 결국 배열은 하나의 큰 문자열로 연결되고 항목은 줄 바꿈으로 구분되어 인쇄됩니다.