ProgramingTip

쉘 펼쳐보기를 사용하여 지정된 패턴 목록 여러 줄을 파일에 삽입

bestdevel 2020. 12. 3. 08:17
반응형

쉘 펼쳐보기를 사용하여 지정된 패턴 목록 여러 줄을 파일에 삽입


쉘 확장을 사용하여 파일에 여러 줄을 삽입하고 싶습니다. 내 입력 파일 내용은 다음과 가변합니다. input.txt :

abcd
accd
cdef
line
web

이제 input.txt 파일 에서 'cdef'줄을 네 줄을 삽입해야 합니다. 내 파일을 삽입하면 다음과 같이 변경됩니다.

abcd
accd
cdef
line1
line2
line3
line4
line
web

위의 삽입은 쉘 펼쳐보기를 사용하여 수행해야합니다. 아무도 나를 도울 수 있습니까?


또 다른 sed,

sed '/cdef/r add.txt' input.txt

input.txt :

abcd
accd
cdef
line
web

add.txt :

line1
line2
line3
line4

테스트 :

sat:~# sed '/cdef/r add.txt' input.txt
abcd
accd
cdef
line1
line2
line3
line4
line
web

input.txt파일 의 변경 사항을 적용하려는 경우 . 그런 다음, 사용 -i과 함께 sed.

sed -i '/cdef/r add.txt' input.txt

당신이 표현으로 정규식을 사용하려는 경우에는 사용할 필요가 -E에 태그를 sed.

sed -E '/RegexPattern/r add.txt' input.txt

GNU 사용 sed:

sed "/cdef/aline1\nline2\nline3\nline4" input.txt

다음으로 경우 :

abcd
accd
cdef
line
web

다음을 생성합니다.

abcd
accd
cdef
line1
line2
line3
line4
line
web

파일의 변경 사항을 제자리에 저장하고 다음과 같이 말하십시오.

sed -i "/cdef/aline1\nline2\nline3\nline4" input.txt

sed '/^cdef$/r'<(
    echo "line1"
    echo "line2"
    echo "line3"
    echo "line4"
) -i -- input.txt

사용 awk:

awk '/cdef/{print $0 RS "line1" RS "line2" RS "line3" RS "line4";next}1' input.txt 

설명 :

  • 삽입하려는 줄을 사용하여 찾습니다. /.../
  • 다음을 사용하여 현재 줄을 인쇄합니다. print $0
  • RS내장되어 awk기본적 세트입니다 new-line.
  • 이 변수로 구분 된 새 줄을 추가합니다.
  • 1끝에는 다른 모든 줄이 인쇄됩니다. 사용 next은 우리가 이미 사용하여 인쇄 한 이후 현재 행을 방지 할 수 있습니다 print $0.

$ awk '/cdef/{print $0 RS "line1" RS "line2" RS "line3" RS "line4";next}1' input.txt
abcd
accd
cdef
line1
line2
line3
line4
line
web

다음을 수행하십시오.

awk '...' input.txt > tmp && mv tmp input.txt

이 대답은 이해하기.

  • 패턴 이전에 복사
  • 라인 추가
  • 패턴 후 복사
  • 원본 파일

    FILENAME = '앱 / 공급자 / AuthServiceProvider.php'

STEP 1 패턴까지 복사

sed '/THEPATTERNYOUARELOOKINGFOR/Q' $FILENAME >>${FILENAME}_temp

2 단계 라인 추가

cat << 'EOL' >> ${FILENAME}_temp

HERE YOU COPY AND
PASTE MULTIPLE
LINES, ALSO YOU CAN
//WRITE COMMENTS

AND NEW LINES
AND SPECIAL CHARS LIKE $THISONE

EOL

3 단계 나머지 파일 추가

grep -A 9999 'THEPATTERNYOUARELOOKINGFOR' $FILENAME >>${FILENAME}_temp

원본 파일 교체

mv ${FILENAME}_temp $FILENAME

변수가 필요한 경우 2 단계에서 'EOL'을 EOL로 바꿉니다.

cat << EOL >> ${FILENAME}_temp

this variable will expand: $variable1

EOL

최소한의 도구로 몇 개의 파일을 템플릿으로 작성해야했으며 위의 문제 sed -e '/../r file.txt는 나머지 일치 항목을 인쇄 한 후에 만 ​​파일을 추가하고 대체하지 않는다는 것입니다.

그렇지 않습니다 (모든 일치 항목이 대체되고 동일한 지점에서 패턴 일치가 계속됨).

#!/bin/bash

TEMPDIR=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
# remove on exit
trap "rm -rf $TEMPDIR" EXIT

DCTEMPLATE=$TEMPDIR/dctemplate.txt
DCTEMPFILE=$TEMPDIR/dctempfile.txt

# template that will replace
printf "0replacement
1${SHELL} data
2anotherlinenoEOL" > $DCTEMPLATE

# test data
echo -e "xxy \n987 \nxx xx\n yz yxxyy" > $DCTEMPFILE

# print original for debug
echo "---8<--- $DCTEMPFILE"
cat $DCTEMPFILE
echo "---8<--- $DCTEMPLATE"
cat $DCTEMPLATE
echo "---8<---"

# replace 'xx' -> contents of $DCTEMPFILE
perl -e "our \$fname = '${DCTEMPLATE}';" -pe 's/xx/`cat $fname`/eg' ${DCTEMPFILE}

awk중간에 일부 명령의 출력을 삽입하는 데 사용할 수 있습니다 input.txt.
삽입 할 줄은에서 생성 한 번호 가있는 cat otherfile, ls -l또는 4 줄 의 출력 일 수 있습니다 printf.

awk 'NR==FNR {a[NR]=$0;next}
    {print}
    /cdef/ {for (i=1; i <= length(a); i++) { print a[i] }}'
    <(printf "%s\n" line{1..4}) input.txt

참고 URL : https://stackoverflow.com/questions/22497246/insert-multiple-lines-into-a-file-after-specified-pattern-using-shell-script

반응형