Unix 如何删除文件中每行的前导空格

Unix 如何删除文件中每行的前导空格,unix,sed,awk,grep,Unix,Sed,Awk,Grep,我有一个类似以下内容的文件: 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++) (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++)
for (i = 0; i < 100; i++)
(i=0;i<100;i++)的

对于(i=0;i<100;i++)
对于(i=0;i<100;i++)
对于(i=0;i<100;i++)
对于(i=0;i<100;i++)
对于(i=0;i<100;i++)
对于(i=0;i<100;i++)
我希望它看起来像这样(删除缩进):

(i=0;i<100;i++)的

对于(i=0;i<100;i++)
对于(i=0;i<100;i++)
对于(i=0;i<100;i++)
对于(i=0;i<100;i++)
对于(i=0;i<100;i++)
对于(i=0;i<100;i++)
如何做到这一点(使用
sed
maybe?)


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

对于此特定问题,类似这样的操作将起作用:

$ sed 's/^ *//g' < input.txt > output.txt
$sed's/^*//g'output.txt
它说用零替换行开头的所有空格。如果还要删除选项卡,请将其更改为:

$ sed 's/^[ \t]+//g' < input.txt > output.txt
$sed's/^[\t]+//g'output.txt
/前面的前导“s”表示“替换”。/是模式的分隔符。前两个/之间的数据是要匹配的模式,第二个/和第三个/之间的数据是要替换的数据。在这种情况下,您将用零替换它。最后一个斜杠后面的“g”表示“全局”执行,即:覆盖整个文件,而不是仅在找到的第一个匹配项上执行

最后,您可以使用
-i
选项代替
output.txt
,这意味着“就地”编辑文件。也就是说,您不需要创建第二个文件来包含结果。如果使用此选项,将丢失原始文件

给你:

user@host:~$ sed 's/^[\t ]*//g' < file-in.txt
user@host:~$sed's/^[\t]*//g'
或:

user@host:~$sed's/^[\t]*//g'file-out.txt
您可以使用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++)

此Perl代码编辑原始文件:

perl -i -ne 's/^\s+//;print' file
perl -i.bak -ne 's/^\s+//;print' file
下一个在编辑原始文件之前制作备份副本:

perl -i -ne 's/^\s+//;print' file
perl -i.bak -ne 's/^\s+//;print' file
请注意,Perl大量借用了sed(和AWK)。

使用:

sed -e **'s/^[ \t]*//'**  name_of_file_from_which_you_want_to_remove_space > 'name _file_where_you_want_to_store_output'
例如:

sed -e 's/^[ \t]*//'  file1.txt > output.txt
注意:

s/
:替换命令~替换每个寻址行上的模式(
^[\t]*

^[\t]*
:搜索模式(^–行的开头;
[\t]*
匹配一个或多个空格,包括制表符)


/
:替换(删除)所有匹配的图案

如果您正在编辑此文件,您可能会高亮显示所有行并使用un选项卡按钮


  • 在Vim中,使用Shift+V突出显示行,然后使用-i(就地)arg按下它将变短您的
    sed
    示例适用于我,而其他类似问题的答案不适用。谢谢@ghostdog74这种表达式([[:blank:])叫什么?我看到另一个例子,人们使用[[:space:]删除前导空格。另外,空白,空格,这里还能用什么词?我只是想了解这个用法。谢谢@olala我在
    tr
    的手册页中找到了这个;[:空白:]所有水平空白,[:空白:]所有水平或垂直空白。因此,如果您使用[[:space:]它不仅应该删除空格和制表符,还应该删除换行符(\n),只留下一行文本。使用[[:blank:]将保留换行符。请注意,我实际上还没有用
    sed
    尝试过这一点,但这是使用
    tr
    FWIW的操作,我无法在OSX小牛上实现这一点(或任何类似的事情),现在我需要它。不过,运行“perl-pe”效果很好。我甚至尝试将-E参数添加到sed中,但没有起到任何作用。我可以确认,OSX Mavericks上的sed在其他类似unix的操作系统中都已损坏。它似乎不允许在字符类中匹配任何转义字符。您可以在OS X上安装gsed。您可以在mac osx上使用ANSI-C引用
    $'
    ,以便它正确解释
    \t
    。必须是单引号,而不是双引号
    sed$的/^[\t]*/'
    此外,mac osx的
    sed
    不是
    gnu
    ,因此许多
    gnu
    功能不受支持@Mac上的per@chrisDefault
    sed
    需要一个临时文件用于内联替换。您通常可以在
    -i
    之后添加
    '
    ,以满足此要求。最后一个命令是,
    sed-i''s/\s*/'yourfile
    不是很直接的答案,但解决了我正在搜索的问题。谢谢普罗米修斯,你在这里的评论是不是想得到一个不同的答案?
    perl -i.bak -ne 's/^\s+//;print' file
    
    sed -e **'s/^[ \t]*//'**  name_of_file_from_which_you_want_to_remove_space > 'name _file_where_you_want_to_store_output'
    
    sed -e 's/^[ \t]*//'  file1.txt > output.txt