我有一个看起来像这样的jsp文件:
<font color="#121212">
<br>
Text 1
<br>
Text 2
<br>
</font>
有没有人知道我可以在我的shell脚本中调用的快速sed / awk命令,用预定义的变量替换“Text 1”和“Text 2”? Text1 / 2只是这个问题的占位符,这些<br>
标记之间的空格可以填充任何内容。
更新:更改标签以允许python中的建议。
答案 0 :(得分:1)
如果您有一些分隔符,则可以在替换文本块之间使用,例如:换行:
$ awk -v text="foo
bar" '
BEGIN {
split(text,t,/\n/)
}
/<br>/ {
if (++c in t) {
print $0 ORS t[c]
f = 1
}
else {
f = 0
}
}
!f
' file
<font color="#121212">
<br>
foo
<br>
bar
<br>
</font>
否则:
$ awk -v text1="foo" -v text2="bar" '
BEGIN {
t[++n]=text1
t[++n]=text2
}
/<br>/ {
if (++c in t) {
print $0 ORS t[c]
f = 1
}
else {
f = 0
}
}
!f
' file
<font color="#121212">
<br>
foo
<br>
bar
<br>
</font>
请注意,如果您在将来需要替换-v/BEGIN
之间的文本和其他代码之间有更多文本,则可以在<br>
部分中添加任意数量的替换文本块不会改变 - 它只是替换了数组t
中填充的块数。
我看到使用getline发布了几个答案。如果您正在考虑使用它,请务必阅读并完全理解http://awk.info/?tip/getline中描述的所有获取警告。恕我直言这个问题不适合使用getline的解决方案。
答案 1 :(得分:0)
sed无法处理多行输入。它逐一读取行。
所以这是一个技巧,但它需要一个你知道在“文本1”或“文本2”中不存在的分隔符(我使用μ)
cat file | tr '\n' 'µ' | sed -e 's/<br>µ[^µ]*µ<br>µ[^µ]*µ<br>/<br>µYOUR TEXT 1µ<br>µYOUR TEXT 2µ<br>/g' | tr 'µ' '\n'
答案 2 :(得分:0)
试试这个awk命令:
awk '/<font /{intag=1}
/<\/font>/{intag=0 ;br=0}
intag==1 && /<br>/{br++}
{print}
br==1{print "Foo"; getline}
br==2{print "Bar"; getline}' file
此命令将在第<br>
个Foo
之后替换第<br>
行,并在第二个Bar
之后使用{{1}}替换。
答案 3 :(得分:0)
我仍然建议在Ruby之类的XML解析器中使用另一种语言。但这是用shell和awk做的一种方法。
#!/bin/sh
FILE=temp.txt
TEXT1="Some things that may include characters not possible with sed."
TEXT2="Some things that may include characters not possible with sed."
awk -v text1="$TEXT1" -v text2="$TEXT2" -- '
{
print
if (/^[[:blank:]]*<font .*>[[:blank:]]*$/) {
while (getline) {
print
if (/^[[:blank:]]*<br>[[:blank:]]*$/) {
print text1
while (getline) {
if (/^[[:blank:]]*<br>[[:blank:]]*$/) {
print
print text2
while (getline) {
if (/^[[:blank:]]*(<br>|<\/font>)[[:blank:]]*$/) {
print
while (getline) {
print
}
}
}
}
}
}
}
}
}
' < "$FILE"
如果您想更加严格,可以删除[[:blank:]] *的所有实例。