我想用相同数量的其他字符替换文件每行上的前导空格或制表符(为简单起见,让我们使用_)。
E.g。
foo bar
foo bar
line 3
变为
foo bar
_foo bar
__line 3
请注意,非领先的whitepsace不受影响,否则这将很容易!我怀疑它仍然很容易,但我错过了这个技巧。
答案 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的经验