如何从 Linux 命令行上的命令输出和文件中删除换行符

avatar
作者
筋斗云
阅读量:21

如何从 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

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!