【发布时间】:2015-11-09 03:52:13
【问题描述】:
我有以下形式的行
line=" this is a line with 2 leading spaces and a trailing control char^M"
我想用 ^M 表示的两个前导空格和尾随控制字符都替换为空。
echo "${line}" | sed 's/^[[:space:]]*//' | tr -dc '[:print:]'
echo "${line}" | sed 's/^[[:space:]]*//' | sed 's/[^[:print:]]//'
两者都有效。我也试过
echo "${line}" | sed 's/^[[:space:]]*|[^[:print:]]//'
但这不起作用。
为什么最后一个表达式不起作用?
如何通过一次调用 sed 和一个正则表达式来完成此操作?
什么是首选解决方案,例如在效率方面?避免许多子shell更好吗?
有没有更好的解决方案?
【问题讨论】:
-
您的表达式中缺少冒号(
:print) + 您需要转义“或”运算符 (\|) -
@ndn 我在询问之前阅读了该帖子,我认为它不是重复的,因为这个问题旨在找到一种通过单个 sed 调用执行多个替换的方法
-
@JiriKremser 我已经更正了“[:print]”错字,谢谢。很抱歉让大家耽搁了这么久......