RE : 파일에서 특정 문자열 뒤에 텍스트를 삽입하는 방법은 무엇입니까?

Nov 17 2020

링크 참조 : 파일에서 특정 문자열 뒤에 텍스트를 삽입하는 방법은 무엇입니까? 이 입력 파일이 있습니다.

Some text
Random
[option]
Some stuff

"[옵션]"앞에 텍스트 줄이 필요합니다.

Some text
Random
Hello World
[option]
Some stuff

이 명령 :

sed  '/\[option\]/i Hello World' input

작동
하지만이 명령 :

perl -pe '/\[option\]/i Hello World' input

작동하지 않습니다.
동등한 perl 명령은 무엇입니까?

최신 정보:

@terdon과 @Sundeep 덕분에이 부분적인 해결책을 찾았습니다.

perl -lpe 'print "Hello World" if /^\[option\]$/' input

하지만 항상 "[옵션]"을 만났을 때만 텍스트 문자열을 삽입하고 싶습니다.
예를 들면 :

Some text
Random
[option]
Some stuff
test1
[option]
test2

지다:

Some text
Random
Hello World
[option]
Some stuff
test1
Hello World
[option]
test2

그리고 아닙니다 :

Some text
Random
Hello World
[option]
Some stuff
test1
[option]
test2

내가 원하는대로.

답변

3 terdon Nov 17 2020 at 20:39

다음은 Perl 접근 방식입니다.

$ perl -ne 'if(/\[option\]/){print "*inserted text*\n"}; print' input
Some text
Random
*inserted text*
[option]
Some stuff

그리고 여기에 더 간결한 또 다른 것이 있습니다.

 $ perl -ne '/\[option\]/?print "*inserted text*\n$_":print' input
Some text
Random
*inserted text*
[option]
Some stuff

이렇게하려면 전체 파일을 메모리로 읽어야합니다.

$ perl -0777 -pe 's/\[option\]/*inserted text*\n$&/' input 
Some text
Random
*inserted text*
[option]
Some stuff
DedicheAnonime Nov 18 2020 at 15:45

@terdon 및 @Sundeep 감사합니다! 이것은 내가 찾던 양식입니다.

perl -lpe 'print "Hello World" if /^\[option\]$/' input

최신 정보:

"[옵션]"을 처음 접할 때만 텍스트 문자열을 삽입하고 싶습니다. 항상 그런 것은 아닙니다.
해결책을 찾았습니다.

perl -lpe 'print "Hello World" if /^\[option\]$/ && ++$i == 1' input

대신 텍스트를 추가하려면 다음 명령을 사용할 수 있습니다.

perl -lpe '$_ .= "\nHello World" if /^\[option\]$/ && ++$i == 1' input

&&는 if의 and이고, "++"또는 "-"는 1의 증가 또는 감소를 의미합니다. 변수 i (다른 변수 일 수 있음)는 기본적으로 0에서 시작하고 증가는 접두사 표기법으로 이루어집니다. , 변수가 먼저 증가한 다음 첫 번째 비교가 이루어짐을 의미합니다. 이 구문은 명령을 매우 탄력적으로 만들고 내가 생각했던 것보다 더 강력합니다. "&&"는 "and"보다 우선 순위가 높습니다. 두 번째 조건은 첫 번째 조건이 충족되는 경우에만 평가됩니다. 따라서이 경우 변수 값은 증가하고 일치가 발생하는 경우에만 비교됩니다.