perl - 仅从文档的开头和结尾修剪空间,而不使用 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>
这是我的假设
\A
仅匹配文档的开头并\Z
匹配文档的结尾(与^
&相对$
)s
在gs
标志中确保整个文档被视为单行,换行符替换为字符\n
我是 perl 的新手。感谢有人可以帮助我了解我哪里出错了
解决方案
您可以perl
在slurp
模式下使用它:
perl -0777 -pe 's/^\s+|\R?\K\s+$//g' file
输出:
START
INDENTED
END
细节:
-0777
启用 slurp 模式以perl
读取完整文件^\s+
在文件开头匹配 1+ 个空格\R?\K\s+$
: 匹配一个换行符,末尾有 1+ 个空格。使用\K
我们在之后重置匹配,\R
以便不删除结束换行符
推荐阅读
- python - 如何在 Windows 上完全卸载 (mini)conda
- java - 引起:java.lang.ClassNotFoundException:org.elasticsearch.transport.Netty3Plugin
- php - Mysql:在一个查询中选择使用名称 NOT IN ($array) AND age IN ($array)
- python - 在 fstring 中创建 fstring 的方法
- android - Android Studio 3.1.3 上的 Gradle 构建错误:服务器未能响应有效的 HTTP 响应
- actions-on-google - 自定义丰富的响应卡 - 可能吗?
- php - 在 Laravel Blade 视图中显示动态 PDF(内容类型:应用程序/pdf)
- python - Python 检查进程是否正在运行,然后重新执行
- linux - 如果第二列与变量匹配,则 Awk 第三列
- file-upload - 多部分上传没有负载