用标签替换所有前4个空格

时间:2016-06-28 03:00:41

标签: shell sed

我正在做一些文档工作,我有这样的树结构:

A
    BB
    C   C
        DD    

如何使用'-'替换线条头部中所有出现的2个空格,如:

A
--BB
--C   C
----DD

我尝试了sed 's/ /-/g',但这会替换所有出现的2个空格;同样sed 's/^ /-/g',这只是替换了第一次出现的2个空格。我怎么能这样做?

1 个答案:

答案 0 :(得分:6)

行开头的四个空格的正则表达式是/^ /,其中我将斜杠用于划分表达式(它们不是实际正则表达式的一部分,但它们被{{1用作分隔符) }})。

sed

在最近的sed 's/^ /\t/' file 版本中,您可以添加sed选项以就地修改-i(即file将使用修改后的文件替换文件) ;在* BSD(包括OSX)上,您需要sed一个空选项参数。

标签的-i ''转义码也不受普遍支持;如果这是一个问题,你的shell可能允许你通过在ctrl-V前面添加一个文字标签。

(您的问题标题显示"标签"但您的问题询问破折号。要替换为两个短划线,请将脚本的替换部分中的\t替换为\t,显然。)

如果你试图概括为"行开头的两个空格的任何组都应该用短划线替换#34;这在--中是不可能做到的,但我建议改为Perl:

sed

这会将匹配捕获到perl -pe 's%^((?: )+)% "-" x (length($1) / 2)%e' file ;内部括号表达式匹配两个空格,$1量词表示尽可能多次匹配。 +标志允许我们在替换中使用Perl代码;这段代码重复了字符/e,重复捕获的表达式的次数,方便地等于其长度的一半。