我有一个文本文件,其开头包含意外空格,我想修剪开头部分并保存。我该怎么做?
我尝试了一个在互联网上找到的非常简单的例子,但它却删除了文件:
cat /etc/nginx/sites-enabled/default| sed -e 's/^[ \t]*//' > /etc/nginx/sites-enabled/default
答案1
这:
cat /etc/nginx/sites-enabled/default| sed -e 's/^[ \t]*//' > /etc/nginx/sites-enabled/default
截断文件,因为>
首先解析重定向;即,文件在运行之前被截断(并cat
读取一个空文件)。sed
cat
该命令还会删除前导空格和制表。
如果这就是您想要的,只需使用就地选项sed
(并删除无用的cat
):
sed -ie 's/^[ \t]*//' /etc/nginx/sites-enabled/default
如果只想删除前导空格,请使用此命令:
sed -ie 's/^ *//' /etc/nginx/sites-enabled/default
而且看起来您只想处理第一行。
如果是这种情况,请在命令1
前面添加一个s
;即:
sed -ie '1s/^[ \t]*//' /etc/nginx/sites-enabled/default
删除第一行的前导空格和制表符,并
sed -ie '1s/^ *//' /etc/nginx/sites-enabled/default
仅删除第一行的前导空格。
答案2
改用这个:
cat 1.txt | sed 's/^ *//;s/ *$//' | sed '/^$/d' > 2.txt
解释
cat 1.txt
- 将文件内容加载为输入sed 's/^ *//;s/ *$//'
- 删除文件两侧的空格。开头或结尾。sed '/^$/d'
- 删除空行(如果上述命令留下空行)> 2.txt
- 将结果保存到新文件中。
如果您不想删除空行,请跳过第三步。在这种情况下,您的命令将变为:
cat 1.txt | sed 's/^ *//;s/ *$//' > 2.txt
例子
输入文本(如图,点表示空格):
输出文本(作为图像,没有删除点和空行):
编辑
如果重定向到自身,上述解释将清空文件,如下所示:
cat 1.txt | sed 's/^ *//;s/ *$//' | sed '/^$/d' > 1.txt
为了处理这个问题并确保内容被重写入文件,我们只需要像下面的命令一样回显输出:
echo | cat 1.txt | sed 's/^ *//;s/ *$//' | sed '/^$/d' > 1.txt
答案3
你也可以使用 Python(Python 2 或 Python 3)来完成这项工作:
python -c 'import sys; print("".join((str(line).lstrip(" ") for line in sys.stdin)))' <INPUTFILE >OUTPUTFILE
此命令的作用:
python -c '...'
或python3 -c '...'
:
启动 Python(2 或 3)解释器并让它运行引号中的命令。import sys; print("".join((str(line).lstrip(" ") for line in sys.stdin)))
:
这是一个压缩为一行的小型 Python 脚本,它从 STDIN(标准输入流)读取所有内容,并在删除每行开头的所有空白字符(包括空格、制表符等)后将其打印回 STDOUT(标准输出流)。它会继续读取,直到流结束,这意味着,如果 STDIN 连接到键盘,则直到您手动输入Ctrl+,D或者如果 STDIN 连接到文件或管道,则直到所有数据都已通过。<INPUTFILE
:
这会将文件INPUTFILE
(替换为适当的文件名)与命令的 STDIN 连接起来。如果省略此项,命令将改为从键盘输入读取。>OUTPUTFILE
:
这会将文件OUTPUTFILE
(替换为适当的文件名)与命令的 STDOUT 连接起来。如果省略此操作,命令将改为将其输出打印到终端。
请注意,在这种情况下INPUTFILE
和OUTPUTFILE
可能不是相同的文件,因为使用的 Bash 输出重定向首先被解析并在脚本从文件读取之前覆盖该文件。
答案4
你可以在 Ex 模式下使用 Vim:
ex -sc '%s/^[ \t]*//|x' /etc/nginx/sites-enabled/default
%
选择所有行s
代替x
保存并关闭