首页 > 解决方案 > 仅从文档的开头和结尾修剪空间,而不使用 shell 脚本中的 perl 触及内部空间

问题描述

我正在尝试在文档的开头和结尾修剪空间,而不使用 bash 脚本中的 perl 触及文件中的中间空间

该文件具有以下格式

<newline>
<space><newline>
<tab><newline>
<space><tab><newline>
START<newline><newline>
<space>INDENTED<newline><newline>
END<newline>
<space><tab><newline>
<tab><newline>
<space><newline>
<newline>

注意:<newline>\n<space> &<tab>\t

所以原始文件看起来像


  
    
    
START


 INDENTED


END

    
    
 


我需要文件的内容是

START<newline><newline>
<space>INDENTED<newline><newline>
END

即像这样的最终文件

START


 INDENTED


END

我尝试使用以下命令同时使用它们,但它也会修剪中间空间。它们都从整个文档中修剪空格和换行符,而不仅仅是从文档的开头

perl -pi -e 's/^\s*//gs' sample.txt
perl -pi -e 's/\A\s*//gs' sample.txt

两者都坍塌了所有内部空间

START<newline>
INDENTED<newline>
END<newline>

我试过这个。它折叠了换行符

perl -pi -e 's/\s*$//gs' sample.txt
perl -pi -e 's/\s*\Z//gs' sample.txt

两者都折叠了换行符

START<space>INDENTEDEND<newline>

这是我的假设

  1. \A仅匹配文档的开头并\Z匹配文档的结尾(与^&相对$
  2. sgs标志中确保整个文档被视为单行,换行符替换为字符\n

我是 perl 的新手。感谢有人可以帮助我了解我哪里出错了

标签: perl

解决方案


您可以perlslurp模式下使用它:

perl -0777 -pe 's/^\s+|\R?\K\s+$//g' file

输出:

START

 INDENTED

END

细节:

  • -0777启用 slurp 模式以perl读取完整文件
  • ^\s+在文件开头匹配 1+ 个空格
  • \R?\K\s+$: 匹配一个换行符,末尾有 1+ 个空格。使用\K我们在之后重置匹配,\R以便不删除结束换行符

推荐阅读