Shell 用制表符替换前4个空格
我正在做一些文档工作,我有这样一个树结构:Shell 用制表符替换前4个空格,shell,sed,Shell,Sed,我正在做一些文档工作,我有这样一个树结构: A BB C C DD 如何用'-'替换行首出现的所有2个空格,如: A --BB --C C ----DD 我试过sed's/-/g',但这将替换所有出现的2个空格;同样sed's/^/-/g',这只是替换了第一次出现的2个空格。如何实现这一点?行开头四个空格的正则表达式是/^/,我在其中放斜杠只是为了划分表达式(它们不是实际正则表达式的一部分,但它们被sed用作分隔符) 在最近的sed版本中,您可
A
BB
C C
DD
如何用'-'
替换行首出现的所有2个空格,如:
A
--BB
--C C
----DD
我试过
sed's/-/g'
,但这将替换所有出现的2个空格;同样sed's/^/-/g'
,这只是替换了第一次出现的2个空格。如何实现这一点?行开头四个空格的正则表达式是/^/
,我在其中放斜杠只是为了划分表达式(它们不是实际正则表达式的一部分,但它们被sed
用作分隔符)
在最近的sed
版本中,您可以添加一个-i
选项来修改文件
(即,sed
将用修改过的文件替换文件);在*BSD(包括OSX)上,您需要带有空选项参数的-i'
\t
选项卡的转义码也不是普遍支持的;如果这是一个问题,您的shell可能允许您通过在文本选项卡前面加上ctrl-V来键入文本选项卡
(您的问题标题为“tab”,但您的问题询问的是破折号。要替换为两个破折号,请将脚本替换部分中的\t
替换为--
。)
如果您试图概括为“行首两个空格的任何组都应替换为破折号”,这在sed
中并非不可能做到,但我建议使用Perl:
perl -pe 's%^((?: )+)% "-" x (length($1) / 2)%e' file
这会将匹配项捕获到
$1
;内括号中的表达式匹配两个空格,+
量词表示尽可能多地匹配这两个空格。/e
标志允许我们在替换中使用Perl代码;这段代码重复字符“-”
的次数与捕获的表达式重复的次数相同,它方便地等于其长度的一半。sed的/^.*/-/g'
产生:A--BB--C--DD
-您必须为此使用sed
吗?任何shell命令都适用于me@Babyy因为每次重复都有两个空格。这真的很有效,谢谢。很抱歉我的描述不好,很高兴你能理解我。但这太复杂了,我不使用perl,有没有一种shell方法可以解决这个问题?塞德·奥克还是别的什么?嗯,这并不复杂。在sed中执行此操作将非常复杂。我想可以创建一个与此相同的Awk脚本;查看match()
函数以了解如何获取正则表达式匹配的长度。awk'match($0,/^()+/)==1{s=”“;for(i=1;i)
perl -pe 's%^((?: )+)% "-" x (length($1) / 2)%e' file