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
#]