如何从文件中的每一行删除前导空格?

Laz*_*zer 63 unix awk grep sed

我有一个看起来像这样的文件:

for (i = 0; i < 100; i++)
    for (i = 0; i < 100; i++)
  for (i = 0; i < 100; i++)
       for (i = 0; i < 100; i++)
     for (i = 0; i < 100; i++)
           for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样(删除缩进):

for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
Run Code Online (Sandbox Code Playgroud)

怎么做(sed可能使用?)

shu*_*lov 114

sed "s/^[ \t]*//" -i youfile
Run Code Online (Sandbox Code Playgroud)

警告:这将覆盖原始文件.

  • 您可以在mac osx上使用ANSI-C引用`$''`来正确解释`\ t`.必须是单引号,而不是双引号.`sed $'s/^ [\ t]*//'`此外,mac osx的`sed`不是`gnu`,因此不支持很多`gnu`功能.@per @chris (6认同)
  • FWIW,我无法让这个(或类似的东西)在OS X Mavericks上工作,现在我需要的时候.然而,运行"perl -pe'<regexp>'"工作正常.我甚至尝试将-E参数添加到sed,这没有帮助. (3认同)
  • 我可以确认OS X Mavericks上的sed在其他所有类似unix的操作系统中都被破坏了.它似乎不允许匹配字符类中的任何转义字符. (3认同)
  • 您可以在OS X上安装gsed. (2认同)
  • Mac上的默认`sed`期望使用临时文件进行内联替换。通常,您可以在`-i`之后添加`'`来满足此要求。最终命令将是`sed -i''s / \ s * //'yourfile` (2认同)

Bry*_*ley 26

对于这个特定问题,这样的事情会起作用:

$ sed 's/^ *//g' < input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)

它说要在一行的开头替换所有空格.如果您还想删除标签,请将其更改为:

$ sed 's/^[ \t]+//g' < input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)

在/之前的领先"s"意味着"替代"./是模式的分隔符.前两个之间的数据是要匹配的模式,第二个和第三个之间的数据是要替换它的数据.在这种情况下,你将一无所获.最后斜杠之后的"g"意味着"全局"地执行它,即:在整个文件上而不是仅在它找到的第一个匹配上.

最后,< input.txt > output.txt您可以使用-i选项来"代替"编辑文件.这意味着,您无需创建第二个文件来包含结果.如果使用此选项,您将丢失原始文件.


gho*_*g74 13

你可以使用awk

$ awk '{$1=$1}1' file
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
Run Code Online (Sandbox Code Playgroud)

SED

$ sed 's|^[[:blank:]]*||g' file
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
Run Code Online (Sandbox Code Playgroud)

shell的while/read循环

while read -r line
do
    echo $line
done <"file"
Run Code Online (Sandbox Code Playgroud)


Chr*_*nat 5

此Perl代码编辑您的原始文件:

perl -i -ne 's/^\s+//;print' file
Run Code Online (Sandbox Code Playgroud)

下一个在编辑原始文件之前制作备份副本:

perl -i.bak -ne 's/^\s+//;print' file
Run Code Online (Sandbox Code Playgroud)

请注意,Perl从sed(和awk)中大量借用