【问题标题】:Perl Regex: Cut and PastePerl 正则表达式:剪切和粘贴
【发布时间】:2017-08-21 13:05:05
【问题描述】:

我正在尝试使用 perl 来编辑文件,主要是在文件中剪切和粘贴内容。但是,看来我错误地构造了正则表达式。我很感激帮助整理它。替换命令应该export PATH=$PATH之后的内容剪切到但包括# THIS IS LAST,并将该内容粘贴到export PATH=$PATH之前

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!

【问题讨论】:

  • Re "剪切export PATH=$PATH之后的内容" ...这真的意味着“在行之后 export ..”吗? (我的回答是做什么的——它将整行与后面的内容交换)
  • @zdim:我的意思是从后续行开始,即export BREW_HOME... 本质上,我想将export PATH=$PATH# THIS LINE IS LAST!之间 的所有内容剪切并粘贴该内容之前 export PATH=$PATH。这有助于澄清意图吗?
  • 是的,我就是这样处理的。修正了我的答案,以解决不应移动的棘手空行:)

标签: regex perl


【解决方案1】:

要跨多行匹配,您需要将整个文件放在一个标量中

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

其中-0777 启用“slurp”模式,(?=...)positive lookahead

\n? 在前瞻中包含不应使用的可选空行,因为不应移动该行。那么前面的模式也需要是非贪婪的。这保护了前面的一个空行,其他任何行都被匹配和交换。

【讨论】:

  • @Miller 感谢 cmets
猜你喜欢
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多