用sed(或类似的)替换前导空格

时间:2012-02-10 03:24:23

标签: regex bash unix sed

我想用相同数量的其他字符替换文件每行上的前导空格或制表符(为简单起见,让我们使用_)。

E.g。

foo bar
 foo bar
  line 3

变为

foo bar
_foo bar
__line 3

请注意,非领先的whitepsace不受影响,否则这将很容易!我怀疑它仍然很容易,但我错过了这个技巧。

5 个答案:

答案 0 :(得分:7)

这对你有用:

sed ':a;s/^\([[:space:]]*\)[[:space:]]/\1_/;ta' file

实施例

$ sed ':a;s/^\([[:space:]]*\)[[:space:]]/\1_/;ta' <<<$'foo bar\n foo bar\n\t\tline 3\n _ x'
foo bar
_foo bar
__line 3
__ x

答案 1 :(得分:3)

你是O.K.用Perl单线程?你可以写:

perl -pe 's/^([ \t]+)/"_" x length $1/e'

(在标准输入的文件中管道,或在cmomand的末尾指定文件名)。

编辑添加: William Pursell,在上面的评论中,询问您是否要“将标签替换为单个'_',或者足以填写一个tabstop”。上面的命令将替换带有单个下划线的选项卡。如果你想要填写一个tabstop,最简单的方法是使用expand实用程序,它将选项卡转换为空格,然后将输入传递给Perl:

expand -i | perl -pe 's/^([ \t]+)/"_" x length $1/e'

(在标准输入文件中输入管道,或在expand部分末尾指定文件名,就在|字符之前。)

答案 2 :(得分:0)

这可能对您有用:

sed '/^\s\+/!b;h;s///;x;s/\S.*//;s/./_/g;G;s/\n//' <<<$'foo bar\n foo bar\n\t\tline 3'
foo bar
_foo bar
__line 3

将初始标签展开为空格,然后展开为下划线:

expand -i <<<$'foo bar\n foo bar\n\t\tline 3' |
sed '/^\s\+/!b;h;s///;x;s/\S.*//;s/./_/g;G;s/\n//'
foo bar
_foo bar
________________line 3

答案 3 :(得分:0)

@ SiegeX的解决方案不适用于Mac OS X Lion上的系统sed。这是一个解决方法:

eval sed "$(for i in $(seq 40 -1 1); do
                  echo -n "-e 's/^$(for j in $(seq 1 $i);
                      do echo -n ' ';
                  done)/$(for j in $(seq 1 $i);
                      do echo -n '_';
                  done)/' "; done)"

动态生成选项

...
-e 's/^       /_______/g' \
-e 's/^      /______/g' \
-e 's/^     /_____/g' \
-e 's/^    /____/g' \
-e 's/^   /___/g' \
-e 's/^  /__/g' \
-e 's/^ /_/g'

答案 4 :(得分:-1)

您可以使用此正则表达式获取前导空格或制表符

(^\s+)

但是用下划线代替它,以及我无法帮助导致我没有使用bash的经验