-1

程序从数据库创建 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'

和其他各种排列

4

4 回答 4

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")行。否则只打印该行。

高温高压

于 2011-12-01T12:14:09.693 回答
0

更新#2

来自 sed 常见问题,第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
于 2011-12-01T13:28:24.147 回答
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

粗鲁,但它应该工作。

于 2011-12-01T13:49:35.473 回答
0

这可能对您有用:

 sed '/^\$WHITE\*(\"5\")\$/{N;N;N;s/.*\n\n\(\(\$WHITE\*(\"\)20\(\")\$\s*\)\n\$HRULE\$\s*$\)/\1\n\210\3/}' file

解释:

匹配第一个字符串$WHITE*("5")$,读取接下来的 3 行并匹配余数。使用分组和反向引用来制定输出行。

于 2011-12-01T15:15:06.813 回答