用sed替换文本

时间:2011-12-01 12:04:56

标签: bash sed solaris tr

程序从数据库创建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 个答案:

答案 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行并匹配其余字符串。使用分组和反向引用来表示输出行。