如何从 Linux 命令行上的命令输出和文件中删除换行符如何从 Bash 中的字符串中删除换行符
以下字符用于操作系统中的换行符:
而且,\n在Linux中使用(也叫EOL,End of Line,换行符)。其他操作系统可能有所不同。
默认情况下,许多程序、Linux 命令行实用程序会自动添加换行符——通常,这会使输出更具可读性。但有时不需要换行符。本说明是关于如何从输出字符串或文件行中删除换行符的。
如何从字符串中删除换行符回声
如果你回显一个字符串或者一个带有“echo”的命令的结果,那么你可以使用-n选项,这意味着不要打印尾随的换行符特点。
注意命令的不同输出:
echo -n 'HackWare.ru' | md5sum ce7d43633e2bfb3d283f2cfbdbeb0d2a - echo 'HackWare.ru' | md5sum 19acfcdef400742c5de064e0bf9e9a87 -
第一条命令计算“HackWare.ru”字符串的校验和,第二条命令计算添加尾随换行符的“HackWare.ru”字符串的校验和。
特
您可以在构造中使用 tr 删除尾随换行符
tr -d '\n'
例如:
echo 'HackWare.ru' | tr -d '\n' | md5sum ce7d43633e2bfb3d283f2cfbdbeb0d2a -
sed
您可以在构造中使用 sed 删除尾随换行符(此命令删除“\n”和“\r”字符:
sed -z 's/[\n\r]//g'
例如:
echo 'HackWare.ru' | sed -z 's/[\n\r]//g' | md5sum ce7d43633e2bfb3d283f2cfbdbeb0d2a -
Perl
下面的 PERL 构造也删除了换行符:
perl -pe 'chomp'
例子:
echo 'HackWare.ru' | perl -pe 'chomp' | md5sum ce7d43633e2bfb3d283f2cfbdbeb0d2a -
另一个用法示例:
wc -l < log.txt | perl -pe 'chomp'
awk
使用 awk,您可以使用以下结构删除换行符:
awk '{ printf "%s", $0 }'
例如:
echo 'HackWare.ru' | awk '{ printf "%s", $0 }' | md5sum
另外一个选择:
awk '{printf $0}'
例如:
echo 'HackWare.ru' | awk '{printf $0}' | md5sum
从命令输出中删除换行符
所有前面的示例都可用于通过管道输出(“|”)从命令输出中删除换行符。下面是一些可用于从命令输出中删除换行符的结构。
打印函数
将 COMMAND 放在表达式中:
printf '%s' $(COMMAND)
将显示执行不带尾随换行符的 COMMAND 的结果。
例如:
printf '%s' $(echo 'HackWare.ru') | md5sum
xargs 和回声
要抑制换行符的输出,可以使用 xargs 构造:
COMMAND | xargs echo -n
小心前面的构造,因为它也会压缩空间。要了解什么是利害攸关的,请检查以下命令的输出:
echo "a b" | xargs echo -n; echo -n $(echo "a b")
由于 xargs 可能非常慢,您可以使用以下构造:
echo -n `COMMAND`
请记住,如果输出以 -e 开头,则先前的构造会将输出解释为“echo”选项。
命令替换
在以下示例中,包含在 $ (COMMAND) 中的命令将在没有尾随换行符的情况下打印:
echo -n "$(wc -l < log.txt)" printf "%s" "$(wc -l < log.txt)"
如何从多行输出中只删除最后一个换行符
前面的所有示例都假定删除字符是从单行输出中完成的。如果您需要从多行输出中删除最后一个字符,下面显示了如何操作。
Perl
以下命令将输出 log.txt 文件的内容,仅删除文件末尾的一个换行符,所有其他换行符将被保留。该命令的特殊之处在于,即使文件以几个换行符结尾,也将全部删除。
perl -pe 'chomp if eof' log.txt
打印函数
以下示例还将删除 log.txt 文件末尾的换行符,但只会删除 LAST 换行符:
printf "%s" "$(< log.txt)"
如何从 Bash 中的文件中删除换行符
您可以将文件输出与上述任何构造结合使用来删除换行符。例如:
cat log.txt | tr -d '\n'
类似于前面的命令:
tr -d '\n' < log.txt
awk、sed、perl 和其他命令可以处理标准输入或获取要处理的文件的名称(删除换行符)作为一个选项。例子:
awk '{ printf "%s", $0 }' log.txt awk '{printf $0}' file sed ':a;N;$!ba;s/\n//g' file.txt perl -p -i -e 's/\R//g;' filename
如何从 Bash 中的变量中删除换行符
要删除换行符(或任何其他字符),您可以使用模式替换(一种 Shell Parameter Expansion),格式如下:
${VARIABLE//FROM/TO}
${VARIABLE/FROM/TO}
${VARIABLE/%FROM/TO}
VARIABLE=${VARIABLE//FROM/TO}
在这种情况下,换行符 (\n) 必须使用反斜杠进行转义。
不删除换行符的可变输出:
text='hello\n\nthere\nagain\n' echo -e ${text}
结果:
hello there again
text='hello\n\nthere\nagain\n' echo -e ${text//\\n/}
结果:
hellothereagain
仅删除第一个换行符的变量输出:
text='hello\n\nthere\nagain\n' echo -e ${text/\\n/}
结果:
hello there again
删除最后一个换行符的变量输出:
text='hello\n\nthere\nagain\n' echo -e ${text/%\\n/}
结果:
hello there again
如何用空格(“”)替换换行符(“\n”)特
要用空格替换换行符 (\n),您可以使用以下结构:
tr '\n' ' '
例如:
echo -e 'hello\n\nthere\nagain\n' | tr '\n' ' '
sed
GNU 搜索引擎优化:
sed ':a;N;$!ba;s/\n/ /g' FILE
适用于 BSD 和 OS X sed 的跨平台兼容语法:
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' FILE
GNU sed 有一个用于零分隔条目(行)的 -z 选项。你可以简单地调用:
sed -z 's/\n/ /g'
例子:
sed -z 's/\n/ /g' FILE
狂欢
慢解决方案:
while read line; do printf "%s" "$line "; done < FILE
另一个解决方案:
cat FILE.txt | while read line; do echo -n "$line "; done
另一种解决方案:
while read line; do echo -n "$line "; done < FILE.txt
Perl
Perl 解决方案,速度与 sed 大致相同:
perl -p -e 's/\n/ /' FILE
粘贴
用tr解决,速度和用paste差不多,只能替换一个字符:
paste -s -d ' ' FILE
awk
使用 awk 的解决方案,速度与使用 tr 大致相同:
awk 1 ORS=' ' FILE
解释:
awk 程序由条件代码块组成的规则组成,即:
condition { code block }
如果省略代码块,则使用默认值:{ print $0 }。因此,1 始终被解释为真条件,并且对每一行执行打印 $0。
当 awk 读取输入时,它根据 RS (记录分隔符)值将其分成记录,默认为换行符,因此 awk 将默认逐行解析输入。拆分还包括从输入记录中删除 RS。
现在,打印记录时,ORS(输出记录分隔符)被添加到其中,默认情况下再次换行。因此,由于我们已将 ORS 值替换为空格,因此所有换行符都将替换为空格。
使用 awk 将所有换行符替换为空格而不将整个文件读入内存的另一种选择:
awk '{printf "%s ", $0}' FILE
如果您希望出现最后的换行符:
awk '{printf "%s ", $0} END {printf "\n"}' FILE
您不仅可以使用空格字符(在本例中,分隔符不是空格,而是“|”字符):
awk '{printf "%s|", $0} END {printf "\n"}' FILE
另一个简单的 awk 解决方案:
awk '{printf $0 " "}' FILE
xargs
简单的 xargs 解决方案:
xargs < FILE.txt