我正在做一些文档工作,我有一个像这样的树结构:
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个空格.我怎样才能做到这一点?
行开头处的四个空格的正则表达式是/^ /
我将斜杠用于划分表达式的位置(它们不是实际正则表达式的一部分,但它们用作分隔符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代码; 这段代码重复该字符的"-"
次数与捕获的表达式重复次数相同,方便地等于其长度的一半.