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按下它将变短您的
示例适用于我,而其他类似问题的答案不适用。谢谢@ghostdog74这种表达式([[:blank:])叫什么?我看到另一个例子,人们使用[[:space:]删除前导空格。另外,空白,空格,这里还能用什么词?我只是想了解这个用法。谢谢@olala我在sed
的手册页中找到了这个;[:空白:]所有水平空白,[:空白:]所有水平或垂直空白。因此,如果您使用[[:space:]它不仅应该删除空格和制表符,还应该删除换行符(\n),只留下一行文本。使用[[:blank:]将保留换行符。请注意,我实际上还没有用tr
尝试过这一点,但这是使用sed
FWIW的操作,我无法在OSX小牛上实现这一点(或任何类似的事情),现在我需要它。不过,运行“perl-pe”效果很好。我甚至尝试将-E参数添加到sed中,但没有起到任何作用。我可以确认,OSX Mavericks上的sed在其他类似unix的操作系统中都已损坏。它似乎不允许在字符类中匹配任何转义字符。您可以在OS X上安装gsed。您可以在mac osx上使用ANSI-C引用tr
,以便它正确解释$'
。必须是单引号,而不是双引号\t
此外,mac osx的sed$的/^[\t]*/'
不是sed
,因此许多gnu
功能不受支持@Mac上的per@chrisDefaultgnu
需要一个临时文件用于内联替换。您通常可以在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