여러 줄을 일치시킨 후 일부 텍스트를 삽입하기 위해 sed를 사용하는 방법은 무엇입니까?

여러 줄을 일치시킨 후 일부 텍스트를 삽입하기 위해 sed를 사용하는 방법은 무엇입니까?

sample.txt다음과 같은 파일이 있습니다.

lots of text
lots of text


#nvram = [
#   these
#   could
#   be,
#   anything
#]

lots of text
lots of text

이것을 얻기 위해 "foobar"라는 텍스트를 추가하고 싶습니다.

lots of text
lots of text


#nvram = [
#   these
#   could
#   be,
#   anything
#]
foobar

lots of text
lots of text

관련 스레드를 살펴보고 많은 것을 시도했지만 정보를 올바른 방식으로 연결할 수 없습니다.

여러 줄 일치: sed 또는 ex를 사용하여 블록(여러 줄의 코드)을 새로운 텍스트 블록(코드)으로 바꾸는 방법은 무엇입니까? https://stackoverflow.com/questions/11234001/replace-multiple-lines-using-sed sed를 사용하여 여러 줄 문자열을 바꾸는 방법은 무엇입니까?

추가의: sed를 사용하여 "test message1" 뒤에 새 줄을 추가하는 방법은 무엇입니까?

나는 다음과 같은 것을 시도해 왔습니다.

sed  '/^#nvram = \[$/{
    N
    ^.*$
}/abc123/' sample.txt

sed '/^#nvram = \[$/ {N; s/\<^#nvram = \[$\>\n<^.*$\>/abc123/g}' sample.txt

sed '/^#nvram = \[$/ {N; s/\<#nvram = \[\>\n\<.*\>/abc123/g}' sample.txt

sed '/^#nvram = \[$/ {N; s/#nvram = \[\n.*/abc123/g}' sample.txt

sed '/^#nvram = \[$/ {N; /#nvram = \[\n.*/abc123/a}' sample.txt

sed '/^#nvram = \[$/ {N; /#nvram = \[(\n.*){1,}/abc123/a}' sample.txt


sed '/^#nvram = \[$/!b;n;cABC' sample.txt

sed '/^#nvram = \[$/N;cABC' sample.txt

sed '/^#nvram = \[$/N/#\]/a;cABC' sample.txt


sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/!{s/./abc/g}}' sample.txt

sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/!{/abc/a}}' sample.txt

sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/!/a abc}' sample.txt

sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/;/a abc}' sample.txt

sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/a abc}' sample.txt


하지만 지금까지 나는 성공하지 못했습니다.

답변1

루프를 사용하는 것은 어떻습니까?

sed '/^#nvram = \[/{
:a                          
N                                                  
/\n#\]/!ba                                                                  
a\
foobar
}
' sample.txt

설명하다:

:a              # begin loop
N               # append next line to pattern space
/\n#\]/!ba      # if we haven't matched the end marker yet, branch back to a
a\              # append after loop exits
foobar

적어도 GNU sed에서는 한 줄의 코드로 작성할 수 있습니다.

sed -e '/^#nvram = \[/{:a; N; /\n#\]/!ba; a\foobar' -e '}' sample.txt

답변2

GNU sed를 사용하면 다음을 수행할 수 있습니다 -z.

$ sed -z 's/#nvram = \[.*\]/&\nfoobar\n/' file
lots of text
lots of text


#nvram = [
#   these
#   could
#   be,
#   anything
#]
foobar

lots of text
lots of text

]"무엇이든"이 실제로 의미하는 바(예: 포함될 수 있는지 여부 )와 파일에 다른 유사한 블록이 있는지 여부에 따라 정규식을 조정해야 할 수도 있습니다 .

anything예를 들어, s가 포함되지 않고 ]입력에 다른 유사한 블록이 있는 경우 이는 더 강력합니다 .

sed -z 's/#nvram = \[[^]]*\]/&\nfoobar\n/' file

답변3

나는 귀하가 취하는 접근 방식을 선택하고 그것이 귀하에게 공감하고 유지되도록 어떻게 작동하게 만드는지 보여줄 것입니다.

$ sed -e '
   /^#nvram = \[$/,/^#]$/!b
   /^#]$/a\
Foobar
' sample.txt

나는 개인적으로 위의 접근 방식을 좋아하지 않으며 다른 작업을 수행합니다.

$ sed -e '
   /^#nvram = \[$/,/^#]$/!b
   /^#]$/G
   s/\n/&Foobar/
' sample.txt

답변4

이것은 또한 간단한 sed입니다:

sed '/#nvram = \[/,/#]/ s/#]/#]\nfoobar/' file

이 문제가 발생한 줄을 찾은 다음 an의 첫 번째 발생을 해결할 #nvram = [때까지 해당 줄 뒤의 모든 줄을 찾은 다음 로 바꿉니다 .#]#]\nfoobar#]

관련 정보