程序从数据库创建HTML文件。标题之间有标题和内容。
没有一定数量的标题。 在每个标题之后,程序放置文本:
$WHITE*("5")$
$WHITE*("20")$
$HRULE$
我需要将这4行的每次出现替换为:
$WHITE*("20")$
$HRULE$
$WHITE*("10")$
我不会讨论使用什么程序:)
我试过了:
sed 's:\$WHITE\*(\"5\")\$\n\n\$WHITE\*(\"20\")\$\n\$HRULE\$:\$WHITE\*(\"20\")\$\
\$HRULE$\
\$WHITE*("10")$:g'
以及其他各种排列
答案 0 :(得分:1)
如果这是您的输入文件,这是规范,您可以这样做:
sed -n '3,$p;$a$WHITE*("10")$' INPUTFILE
但我认为情况并非如此,所以你可能想要重新提出你的问题和/或提供更多细节。
sed更具体的解决方案:
sed '/^\$WHITE\*("5")\$$/,/^$/d;/\$HRULE\$/ a$WHITE*("10")$' INPUTFILE
(搜索$WHITE*("5")$
行并删除它直到(包括!)下一个空行。然后搜索下一个$HRULE$
行并附加$WHITE*("10")$
行。
awk
解决方案:
awk '/\$WHITE\*\("5"\)\$/ { getline ; next }
/\$WHITE\*\("20"\)\$/ { print ;
getline ;
if ($0 ~ /\$HRULE\$/) { print ;
print "$WHITE*(\"10\")$" ;
}
else { print }
}
1 ' INPUTFILE
这会读取文件并打印每一行 - 这就是1
存在的原因,除非它找到它丢弃它的$WHITE*("5")
模式,读取下一行并删除它。如果它发现$WHITE*("20")
打印它。读取下一行,如果其$HRULE$
然后打印该行和附加的$WHITE*("10")
行。其他只是打印线。
HTH
答案 1 :(得分:0)
更新#2
来自sed faq,第4.23.3部分
如果您需要匹配静态文本块(可能在整个文件中出现任意次数),预先知道块的内容,则此脚本易于使用
更新#1
的Python?
$ cat input
first line
second line
3rd line
$WHITE*("5")$
$WHITE*("20")$
$HRULE$
some more lines
yet another
$WHITE*("5")$
$WHITE*("20")$
$HRULE$
THE END
脚本:
#!/usr/bin/env python
## Use these 3 lines for python version < 2.5
#fd=open('input')
#text=fd.read()
#fd.close()
## Use these 2 lines for python version >= 2.5
with open('input') as fd:
text=fd.read()
old="""$WHITE*("5")$
$WHITE*("20")$
$HRULE$
"""
new="""$WHITE*("20")$
$HRULE$
$WHITE*("10")$
"""
print text.replace(old,new)
输出:
first line
second line
3rd line
$WHITE*("20")$
$HRULE$
$WHITE*("10")$
some more lines
yet another
$WHITE*("20")$
$HRULE$
$WHITE*("10")$
THE END
答案 2 :(得分:0)
尝试类似
的内容 sed -e '${p;};/$WHITE\*("5")\$/,/$HRULE\$/{H;/$HRULE\$/{g;s/$HRULE\$//;s/20/10/;s/5/20/;s/\n/&$HRULE$/2p;s/.*//p;x;d;};d;};' white.txt
原油,但它应该有效。
答案 3 :(得分:0)
这可能对您有用:
sed '/^\$WHITE\*(\"5\")\$/{N;N;N;s/.*\n\n\(\(\$WHITE\*(\"\)20\(\")\$\s*\)\n\$HRULE\$\s*$\)/\1\n\210\3/}' file
说明:
匹配第一个字符串$WHITE*("5")$
,读取接下来的3行并匹配其余字符串。使用分组和反向引用来表示输出行。