Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 用制表符替换前4个空格_Shell_Sed - Fatal编程技术网

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