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

Jia*_*gty 4 shell sed

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

A
    BB
    C   C
        DD    
Run Code Online (Sandbox Code Playgroud)

如何替换行首脑中所有出现的2个空格'-',如:

A
--BB
--C   C
----DD
Run Code Online (Sandbox Code Playgroud)

我试过了sed 's/ /-/g',但这取代了所有出现的2个空格; 此外sed 's/^ /-/g',这只是替换了第一次出现的2个空格.我怎样才能做到这一点?

tri*_*eee 6

行开头处的四个空格的正则表达式是/^ /我将斜杠用于划分表达式的位置(它们不是实际正则表达式的一部分,但它们用作分隔符sed).

sed 's/^    /\t/' file
Run Code Online (Sandbox Code Playgroud)

在最新sed版本中,您可以添加一个-i选项来file就地修改(即,sed将文件替换为已修改的文件); 在*BSD(包括OSX)上,您需要-i ''一个空选项参数.

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

(你的问题标题是"tab",但你的问题是关于破折号.要用两个破折号替换,显然要替换\t脚本的替换部分--.)

如果你试图概括为"行开头的任何两个空格的组应该用短划线代替",这不是不可能的sed,但我会推荐Perl:

perl -pe 's%^((?:  )+)% "-" x (length($1) / 2)%e' file
Run Code Online (Sandbox Code Playgroud)

这将比赛捕获到$1; 内部括号表达式匹配两个空格,+量词表示尽可能多地匹配该空格.该/e标志允许我们在替换中使用Perl代码; 这段代码重复该字符的"-"次数与捕获的表达式重复次数相同,方便地等于其长度的一半.

  • @Babyy因为每次重复都包含两个空格. (2认同)