2011-12-01 125 views
-1

程序從數據庫創建HTML文件。標題之間有標題和內容。用sed替換文本

沒有一定數量的標題。 每個標題程序後放置文本:

$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' 

和各種其他排列

+2

輸入和輸出之間的關係是什麼?例如。第一行是從$ WHITE *(「5」)$'到'$ WHITE *(「20」)$'等的? – MattH

+0

你可能會更好地使用GNU userland工具。機會是你有他們,但你需要明確調用'gsed'('ggrep','gfind'等)來獲得GNU版本。 GNU版本總是更多的功能豐富,並在網絡上享受更大的流行度 – sehe

+2

順便說一句,告訴我們你的嘗試。無關緊要,它不起作用,但「它沒有用」並不能給我們提供很多關於你想要什麼/我們不需要先嚐試的線索。 -1直到你添加信息 – sehe

回答

0

更新#2

從SED FAQ,部分4.23.3

If you need to match a static block of text (which may occur any number of times throughout a file), where the contents of the block are known in advance, then this script is easy to use

UPDATE#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 
+0

我修改了描述,請檢查一下,看看你是否明白我需要更好的,謝謝 –

+0

不錯,或許更好一點:-)你的第一個描述非常含糊 –

+0

謝謝,我從來沒有用過python,我怎麼保存腳本,以及如何運行它?我在solaris上使用bash 5.10 –

1

如果這是你輸入的文件,這就是天賦,你可以這樣做:

sed -n '3,$p;$a$WHITE*("10")$' INPUTFILE 

但我認爲並非如此,所以你可能要重新表述您的問題和/或提供一些更多的detailes 。

與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 

這讀取文件和打印EV紅線 - 這就是爲什麼1在那裏,除非它發現$WHITE*("5")模式,它會讀取下一行並刪除它。如果它發現$WHITE*("20")打印它。閱讀下一行,如果其$HRULE$然後打印該行和附加的$WHITE*("10")行。否則只是打印該行。

HTH

+0

我只是想用底部文本替換頂部文本 –

+0

請參閱我的更新回答。 –

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 

原油,但它應該工作。

+0

不適合我,輸出文件只是空的 –

+0

@AydinHassan:什麼版本的sed? – Sorpigal

0

這可能會爲你工作:

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

說明:

匹配的第一個字符串$WHITE*("5")$,看了下3線和匹配的剩餘部分。使用分組和回參考來制定輸出行。

+0

不起作用:echo -e'$ WHITE *(「10」)$ \ n \ n $ WHITE *(「20」)$ \ n $ HRULE $'| sed'/^\ $ WHITE \ *(\「5 \」)\ $/{N; N; N; s /.* \ n \ n \(\ (\「)\ $ \ s * \)\ n \ $ HRULE \ $ \ s * $ \)/ \ 1 \ n \ 210 \ 3 /}' sed:命令結尾的額外文本:/^\ $ WHITE \ *(\ 「5 \」)\ $/{N; N; N; S /.* \ n \ n \(\(\ $ WHITE \ *(\ 「\)20 \(\」)\ $ \ s * \)\ n \ $ \ HRULE \ $ \ s * $ \)/ \ 1 \ n \ 210 \ 3 /} –

+0

@AydinHassan您在問題中表示它必須匹配'$ WHITE *(「5」)$ $ WHITE *(「20」)$ $ HRULE $'NOT'$ WHITE *(「10」)$ .....' – potong