2014-05-21 116 views
1

這是從一個文件中的一個片段:替換SED文本塊或在awk

COMMAND : /* some text 1 */ 
ACTION : /* some text 1 in multiple lines */ 
COMMAND : /* some text 2 */ 
ACTION : /* some text 2 in multiple lines */ 
. 
. 
. 

這下去。 我想使用sed或awk工具替換從COMMAND開始的文本直到其相應的ACTION(即在下一個COMMAND之前)與另一個文本。

所以,如果我想用一些文字刪除第一個命令行動小組,下面將是這個結果。

USED SED/AWK HERE 
COMMAND : /* some text 2 */ 
ACTION : /* some text 2 in multiple lines */ 
. 
. 
. 
+3

我們如何知道哪些命令是你的意思,如果有很多? –

+1

@MarkSetchell每個COMMAND之後的文本是不同的,因此可能有用嗎? –

+1

行之間是否有空行? –

回答

0

使用這樣的:

sed ':a;N;$!ba;s/\nACTION/ ACTION/g' | sed 's/ACTION.*$/MY_TEXT/g' 
0

您可以使用awk這樣,你把一個文件的替換文本稱爲repl.txt

awk '/^COMMAND x/{del=1;print;system("cat repl.txt");next} {if(!del)print} /^ACTION/{del=0}' file 

基本上,當它發現COMMAND你正在尋找,它設置del cariable所以它知道要刪除的行動,並打印COMMAND,幷包括來自文件repo.txt的文本。然後刪除它看到的所有行,直到它看到一條從ACTION開始的行時,它會停止刪除。

COMMAND x是你正在尋找的特定命令。

或者你可以把你替換文本在AWK直接如果是小:

awk '/^COMMAND x/{del=1;print;print "Replacement text";next} {if(!del)print} /^ACTION/{del=0}' file 
0

通用於所有的COMAND /動作

sed '/COMMAND/,/ACTION/ { 
    /COMMAND/ i\ 
Put your new text \ 
and lines here 
    d 
    }' YourFile 

特定頂級命令文本內容

SearchText='your pattern search text (reduce regex format)" 

sed "/COMMAND.*${SearchText}/,/ACTION/ { 
    /COMMAND/ i\ 
Put your new text \ 
and lines here 
    d 
    }" YourFile 
0

GNU awk(由於RS)應跳過第一組

awk -v RS="COMMAND :" 'NR>2 {print RS$0}' file 
COMMAND : /* some text 2 */ 
ACTION : /* some text 2 in multiple lines */ 

或者是這一點,你的意思是:

awk -v RS="COMMAND :" 'NR>1{$0=RS $0} NR==2 {$0="New text"}1' file 

New text 
COMMAND : /* some text 2 */ 
ACTION : /* some text 2 in multiple lines */ 
0

Upvoted:

sed '/COMMAND/,/ACTION/ { 
/COMMAND/ i\ 
Put your new text \ 
and lines here 
d 
}' YourFile 

使用awk(NAWK或呆子真的,AWK是沒用的),你可以這樣做:

replace='myReplaceBlockLine1\nmyReplaceBlockLine2' 
nawk '/COMMAND/,/ACTION/{ myvar=replace; gsub(/\\n/,"\n",myvar); print myvar; next} 1' 
"replace=$replace" input_file.txt 

兩者都有缺陷 - 沒有反向引用支持。 awk的上升 - 你可以添加一些邏輯,如只替換第一次發生或刪除重複項