删除文本文件中的缩进

删除文本文件中的缩进

我有这样的文字:

    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)。

相关内容