마지막 패턴 일치 앞에 파일 2줄에 텍스트를 추가합니다.

마지막 패턴 일치 앞에 파일 2줄에 텍스트를 추가합니다.

TEXTmyfile.txt텍스트가 발견된 마지막 위치에 여러 줄 문자열을 추가 해야 합니다 # My Search.

일반적인 패턴 교체인 경우에는 괜찮습니다 sed. i하지만 .에서 일치 항목보다 두 행 위로 이동하는 방법을 모르겠습니다 sed.

예, myfile.txt:

text1
text2
#
# My Search
#
text4
text5
#
# My Search
#
text6

TEXT좋다:

TEXT="
[my search]
home=/var/home
string=random

"

myfile.txt끝을 지켜봐야 합니다:

text1
text2
#
# My Search
#
text4
text5

[my search]
home=/var/home
string=random

#
# My Search
#
text6

답변1

grep -n줄 번호를 추출한 다음 이를 sed 주소에 사용하여 텍스트를 삽입하려면 텍스트를 올바르게 인용해야 합니다. 즉, 각 줄 바꿈 앞에는 백슬래시가 있어야 합니다 .

line=$(grep -n '# My Search' myfile.txt | tail -n1 | cut -f1 -d:)
((--line))
text=${TEXT//$'\n'/$'\\\n'}
text=${text%$'\\\n'}$'\n'

sed "$line i \\
$text" myfile.txt

답변2

tac+bash(변수 대체) + GNUsed방법:

txt_reversed=$(echo "$TEXT" | tac)
tac myfile.txt \
| sed -e "N;N;N; s~#\n# My Search\n#~&${txt_reversed//$'\n'/\\n}\n~" | tac

산출:

text1
text2
#
# My Search
#
text4
text5

[my search]
home=/var/home
string=random

#
# My Search
#
text6

답변3

이 작업을 한 번에 수행하는 가장 쉬운 방법은 뒤로 검색할 수 있는 도구를 사용하는 것인데, ed이것이 그 중 하나입니다. 이상적으로는 텍스트를 파일(예: insert.txt)에 저장하고 마지막 항목 앞에 파일 내용을 두 줄 삽입하여 PATTERN다음을 실행할 수 있습니다.

ed -s infile <<\IN
.t.
?PATTERN?-2r insert.txt
$d
,p
q
IN

마지막 항목을 찾아 다른 줄로 PATTERN이동하여 삽입합니다 . 그런 다음 버퍼의 내용을 인쇄합니다 . 파일을 그 자리에서 편집하려면 해당 파일을 .2rinsert.txt,pw


뒤로 검색할 수 없는 다른 도구의 경우 두 단계를 수행하는 것이 좋습니다. 첫 번째 단계 - 줄 번호를 가져오고 두 번째 단계 - line 뒤 NR-2또는 line 앞에 텍스트 내용을 삽입합니다 NR-1. 변수에 저장된 텍스트의 경우 정규식에 의존하는 다른 도구를 선호합니다 awk(후자는 특수 문자를 이스케이프하기 위해 삽입할 텍스트를 전처리해야 합니다. 개행 문자뿐만 아니라 이스케이프해야 하는 여러 문자가 있습니다. 사용된 기술):

export TEXT
awk 'NR==FNR{if ($0 ~ /PATTERN/){c=NR};next}
{if (FNR==(c-1)){print ENVIRON["TEXT"]}};1' infile infile

답변4

stackExchange에 대한 나의 첫 번째 기여입니다.

마지막 일치 항목 앞에 행을 삽입하는 방법입니다 sed.

sed -e '/PATTERN[^\n]*/,$!b;//{x;//p;g};//!H;$!d;x;iTEXTOINSERT' FILE

sed첫 번째 일치 항목 앞에 행을 삽입하는 방법입니다.

sed -i -e '/PATERN/{a\\TEXTOINSERT' -e ':a;n;ba}' FILE

인사!

관련 정보