我有这样的文字:
it's like a foo.
it's like a bar.
it's like a bar.
it's like a foo.
我想删除第一行的缩进或空格,并删除后续行中相同数量的缩进或空格。
如果后续行的空格或缩进少于第一行的空格或缩进数,则删除开头的所有空格或缩进。
输出是:
it's like a foo.
it's like a bar.
it's like a bar.
it's like a foo.
答案1
使用expand
(将 TAB 扩展为 SPC,假设制表符每 8 列停止一次;不考虑其他空白字符)和awk
:
<your-file expand | awk -F '[^ ]' '
NR == 1 {n = length($1)}
{sub("^ {1,"n"}", ""); print}'
答案2
使用perl
:
$ perl -pe 'if($.==1){s/^(\s+)//; $s=length($1);}else{s/^\s{0,$s}//}' file
it's like a foo.
it's like a bar.
it's like a bar.
it's like a foo.
要直接编辑原始文件,请使用-i
:
perl -i -pe 'if($.==1){s/^(\s+)//; $s=length($1);}else{s/^\s{0,$s}//}' file
答案3
必须启动 python 解释器感觉很糟糕,但这也是一个选择:
python -c "import textwrap,sys; print(textwrap.dedent(sys.stdin.read()))" < myfile
答案4
您可以使用 来完成sed
,只需做一些准备工作:
n=$(( $(sed -n '1s/[^[:space:]].*//; p; q' file | wc -c) - 1 ))
sed 's/^[[:space:]]\{1,'"$n"'\}//' file
第一行将变量 ( $n
) 设置为文件第一行中前导空格的数量。看到的字节数wc
包括换行符,因此我们为此减去一。第二行运行一个表达式,该表达式使用语法sed
以可变数量(从 1 到 )删除行开头的空格。$n
\{n,m\}
您的 sed 可能支持“就地”编辑选项 ( -i
)。