ansible 또는 unix 명령을 사용하여 파일에서 특정 패턴이 일치할 때마다 줄을 삽입합니다.

ansible 또는 unix 명령을 사용하여 파일에서 특정 패턴이 일치할 때마다 줄을 삽입합니다.

텍스트 파일에서 특정 문자열이 나올 때마다 줄을 삽입하려고 합니다. ansible 모듈을 사용해 보았지만 lineinfile파일에서 일치하는 문자열의 마지막 또는 첫 번째 인스턴스 뒤에만 줄을 삽입합니다. 쉘 스크립트나 Ansible 플레이북을 사용하여 이를 달성하는 방법을 아는 사람이 있습니까? 저는 Linux OS를 사용하고 있으므로 이 문제를 해결하는 데 UNIX 명령이 도움이 될 것입니다.

아래와 같이 다음 mba으로 시작하는 각 줄 뒤에 삽입 하려고 합니다 foo.

원본 txt 파일 내용:

foo
ab
zz
foo='dummy'
cd
zz
foo='dats'
lm
xx

원하는 출력:

foo
mba
ab
zz
foo='dummy'
mba
cd
zz
foo='dats'
mba
lm
xx

답변1

A 기반 솔루션은 awk다음과 같습니다.

awk '{print} /^foo/{print "mba"}' input.txt

기본적으로 이는 현재 줄을 인쇄하지만, 시작하는 경우 처리가 다음 줄로 계속되기 전에 추가 줄 foo도 인쇄합니다 .mba

답변2

묻다:""foo"라는 텍스트로 시작하는 각 줄 뒤에 "mba"를 삽입합니다."

답: 사용바꾸다Ansible에서는 다음과 같은 파일이 제공됩니다.

shell> cat foo.txt
foo
ab
zz
foo='dummy'
cd
zz
foo='dats'
lm
xx

    - replace:
        path: foo.txt
        regexp: '^foo(.*)$'
        replace: |-
          foo\1
          mba

주어진

shell> cat foo.txt
foo
mba
ab
zz
foo='dummy'
mba
cd
zz
foo='dats'
mba
lm
xx

다음 작업은 동일한 결과를 제공하며 멱등적입니다.

    - replace:
        path: foo.txt
        regexp: 'foo(.*)\n(?!mba)(.*)'
        replace: |-
          foo\1
          mba
          \2

답변3

몇 가지 옵션이 있습니다:

  • perl

    $ perl -pe 's/^foo.*/$&\nmg/' file
    foo
    mg
    ab
    zz
    foo='dummy'
    mg
    cd
    zz
    foo='dats'
    mg
    lm
    xx
    
  • awk

    $ awk '1;/^foo/{print "mg" }' file
    foo
    mg
    ab
    zz
    foo='dummy'
    mg
    cd
    zz
    foo='dats'
    mg
    lm
    xx
    

답변4

awk

awk '/foo/ {$0 = $0"\nmba"}1' $file

sed

sed 's/foo.*/&\nmba/' $file
foo
mba
ab
zz
foo='dummy'
mba
cd
zz
foo='dats'
mba
lm
xx

관련 정보