텍스트 파일에서 특정 문자열이 나올 때마다 줄을 삽입하려고 합니다. 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