У меня есть файл JSON, содержащий несколько вхождений replaceme
.
Я хочу только заменить вхождение на основе конкретной строки, найденной несколькими строками выше.
Например.,
[...]
"title" : {
"Propertie1" : "xxxx",
"Propertie2: "replaceme"
}
"title2" : {
"Propertie1" : "xxxx",
"Propertie2: "replaceme"
}
"title" : {
"Propertie1" : "xxxx",
"Propertie2: "replaceme"
}
"title2" : {
"Propertie1" : "xxxx",
"Propertie2: "replaceme"
}
[...]
В этом примере я хочу заменить replaceme
только для title2
.
С участием awk 'title2/,/replaceme/' myFile
Я могу найти часть моего файла JSON. Мне тоже нужно выполнять команду sed, но я не знаю, как это сделать, и возможно ли это вообще?
[vagrant@localhost ~]$ sed -e '/"title2/,/}/{ s/replaceme/title2/; }' test
"title" : {
"Propertie1" : "xxxx",
"Propertie2: "replaceme"
}
"title2" : {
"Propertie1" : "xxxx",
"Propertie2: "title2"
}
"title" : {
"Propertie1" : "xxxx",
"Propertie2: "replaceme"
}
"title2" : {
"Propertie1" : "xxxx",
"Propertie2: "title2"
}
Источники
https://stackoverflow.com/questions/268045/multi-line-search-and-replace-tool
http://sed.sourceforge.net/sedfaq4.html#s4.23.3
4.24. How do I address all the lines between RE1 and RE2, excluding the lines themselves?
Normally, to address the lines between two regular expressions, RE1 and RE2, one would do this: '/RE1/,/RE2/{commands;}'. Excluding those lines takes an extra step. To put 2 arrows before each line between RE1 and RE2, except for those lines:
sed '1,/RE1/!{ /RE2/,/RE1/!s/^/>>/; }' input.fil
The preceding script, though short, may be difficult to follow. It also requires that /RE1/ cannot occur on the first line of the input file. The following script, though it's not a one-liner, is easier to read and it permits /RE1/ to appear on the first line:
# sed script to replace all lines between /RE1/ and /RE2/,
# without matching /RE1/ or /RE2/
/RE1/,/RE2/{
/RE1/b
/RE2/b
s/^/>>/
}
#---end of script---
Contents of input.fil: Output of sed script:
aaa aaa
bbb bbb
RE1 RE1
aaa >>aaa
bbb >>bbb
ccc >>ccc
RE2 RE2
end end