2017-08-09 73 views
1

我試圖用perl編輯文件,實質上是剪切和粘貼文件內的內容。但是,似乎我錯誤地構造了正則表達式。我很感謝幫忙分揀出來。替換命令應該砍砍export PATH=$PATH後的內容,直到但包括# THIS IS LAST,並粘貼之前export PATH=$PATHPerl正則表達式:剪切和粘貼

的Perl命令的內容: perl -i -pe 's;(export PATH.*\n)(.*)(\# THIS IS LAST!\n);$2$1$3;' bashrc

當前的.bashrc:

export TERM=xterm 
export PATH=$PATH 
export BREW_HOME=/home/dev/.linuxbrew 
export ANACONDA_HOME=/home/dev/.anaconda3 

# THIS IS LAST! 

期望的bashrc:

export TERM=xterm 
export BREW_HOME=/home/dev/.linuxbrew 
export ANACONDA_HOME=/home/dev/.anaconda3 
export PATH=$PATH 

# THIS IS LAST! 
+0

Re「_cut內容後導出PATH = $ PATH'_」......這是否真的意味着「後**線**'出口..」「? (我的答案是 - 它將整行與後面的內容交換) – zdim

+0

@zdim:我的意思是從後續行開始,即'export BREW_HOME ...'本質上,我想要在**行之間切割所有行'export PATH = $ PATH'和'#THIS LINE IS LAST!'並在**'export PATH = $ PATH'之前粘貼該內容**。這有助於澄清意圖嗎? – Ari

+0

是的,我就是這麼拿的。修正了我的答案,以解決那個不應該移動的棘手的空行:) – zdim

回答

3

要在多行匹配,你需要把整個文件中的標

perl -0777 -pe's/(export PATH.*?\n)(.*?)(?=\n?# THIS IS LAST)/$2$1/s' input.txt 

其中-0777使「啜食」模式,(?=...)positive lookahead

\n?在包含不應該被消耗的可選空行的前瞻中,因爲該行不應被移動。那麼之前的模式也需要非貪婪。這保護了一個前面的空行,任何其他行都被匹配並交換。

+0

@Miller感謝您的意見 – zdim