将前导空格与 sed (全部)匹配的正确方法?

将前导空格与 sed (全部)匹配的正确方法?

如何将前导空格与sed(全部)匹配?我不是在谈论前导制表符,而只是在谈论前导空格。

从我在 Nano 中所做的一个小测试来看,这似乎是正确的:

sed "s/^ //g"

你发现这个方法有什么问题吗?


注意:“全部”是指文档中的所有前导空格,如果有 2 个或更多(而不仅仅是 1 个)。

答案1

删除前导空格:sed "s/^ *//"

删除前导空格:sed "s/^[[:space:]]*//"

删除前导空格和制表符:(sed "s/^[ \t]*//"在 GNU sed 中工作)或
sed 's/^[[:blank:]]*//'(与任何 一起工作sed)或sed $'s/^[ \t]*//'(在 ksh/Bash/etc. 中为 提供文字制表符sed

正如评论中所述,/g说明符不执行任何操作,因为行首仅在行中出现一次,甚至/g不会多次重试该模式。您需要显式添加条件分支来重复替换:sed -e :a -e 's/^ //' -e ta


^ *也匹配空字符串(没有空格),但这并不重要。如果要匹配至少有一个空格的行,请在扩展正则表达式中使用^ *(双空格) 或。^ +例如,要将所有缩进更改为恰好两个空格,请使用 sed -e 's/^ */ /'or sed -Ee 's/^ +/ /'-E例如 GNU 和 FreeBSD 支持)

答案2

您也可以使用下面的 awk 命令来完成此操作

 awk '{gsub("^ *","",$0);print $0}' filename

相关内容