2013-06-03 286 views
4

我想取代文件的第二行,我知道$用於最後一行,但不知道如何從結尾說第二行。sed取代文件的第二行最後一行

parallel (
{ 
ignore(FAILURE) { 
build("Build2Test", BUILDFILE: "", WARFILE: "http://maven.example.com/130602.0.war", STUDY: "UK", BUG: "33323") 
}}, 
) 

我想}}總之我想刪除,逗號來代替}},,但這個文件有許多其他的代碼,所以我不能使用模式匹配我需要使用二線從文件末尾。

回答

6

以下應工作(注意,在某些系統上,你可能需要刪除所有評論):

sed '1 {  # if this is the first line 
    h    # copy to hold space 
    d    # delete pattern space and return to start 
} 
/^}},$/ {  # if this line matches regex /^}},$/ 
    x    # exchange pattern and hold space 
    b    # print pattern space and return to start 
} 
H    # append line to hold space 
$ {    # if this is the last line 
    x    # exchange pattern and hold space 
    s/^}},/}}/  # replace "}}," at start of pattern space with "}}" 
    b    # print pattern space and return to start 
} 
d    # delete pattern space and return to start' 

還是緊湊型:

sed '1{h;d};/^}},$/{x;b};H;${x;s/^}},/}}/;b};d' 

例子:

$ echo 'parallel (
{ 
ignore(FAILURE) { 
build("Build2Test", BUILDFILE: "", WARFILE: "http://maven.example.com/130602.0.war", STUDY: "UK", BUG: "33323") 
}}, 
)' | sed '1{h;d};/^}},$/{x;b};H;${x;s/^}},/}}/;b};d' 
parallel (
{ 
ignore(FAILURE) { 
build("Build2Test", BUILDFILE: "", WARFILE: "http://maven.example.com/130602.0.war", STUDY: "UK", BUG: "33323") 
}} 
) 
7

如果您知道,如何更改第N行,只需先將文件倒轉,例如它不像其他sed解決方案那麼專業,但是可以工作...... :)

tail -r <file | sed '2s/}},/}}/' | tail -r >newfile 

例如,從下一輸入上述

}}, 
}}, 
}}, 
}}, 
}}, 

使得

}}, 
}}, 
}}, 
}} 
}}, 

tail -r是BSD等效的Linux的tac命令。在Linux上使用tac在OS X或Freebsd上使用tail -r。 Bot做同樣的操作:以行的順序打印文件(最後一行打印爲第一行)。

3

這可能爲你工作(GNU SED):

sed '$!N;$s/}},/}}/;P;D' file 

請模式空間兩條直線,並在-結束文件替換所需要的模式。

5

扭轉文件,工作二號線,然後再反向文件:

tac file | sed '2 s/,$//' | tac 

將結果保存回「文件」,將其添加到命令

> file.new && mv file file.bak && mv file.new file 

或者,使用ed腳本

ed file <<END 
$-1 s/,$// 
w 
q 
END 
相關問題