首页 > 解决方案 > 我无法从 shell 脚本中的文本中删除新行(使用 sed 和 grep)

问题描述

我在 macOS 上使用 zsh

我有一个 shell 脚本,它生成一个带有 speedtest 结果的文本文件,布局如下:

 Download:    63.57 Mbps (data used: 69.3 MB)                               

 Upload:    16.11 Mbps (data used: 23.0 MB) 

                          

我可以操纵布局并产生这个:

↓ 63.57 Mbps | 
↑ 16.11 Mbps 

注意第一行文本之前的换行符和管道之后的换行符。在终端中仅打印出最后一行:↑ 16.11 Mbps

转换输入的脚本是这样的:

DOWNLOAD=$(cat ~/Terminal_Projects/temp_speedtest_result.txt | grep Download | sed 's/   Download:    /↓ /g' | sed 's/ (data used: //g' | sed -E 's/[0-9]{1,4}\.[0-9] MB)//g' | sed 's/\n\r\t//')
UPLOAD=$(cat ~/Terminal_Projects/temp_speedtest_result.txt | grep Upload | sed 's/     Upload:    /↑ /g' | sed 's/ (data used: //g' | sed -E 's/[0-9]{1,4}\.[0-9] MB)//g' | tr '\n' ' ')
RESULT=$DOWNLOAD" | "$UPLOAD
echo $RESULT

我使用了多个 sed 实例,因为我无法让它在一个实例中工作。你可能知道如何让它工作。

我想要做的是在一行上输出 DOWNLOAD 和 UPLOAD 变量。我有另一个非常相似的脚本,它通过完全相同的变量操作来实现这一点。

我试过的:

使用 RESULT="$DOWNLOAD | $UPLOAD"

使用 RESULT="${DOWNLOAD} | ${UPLOAD}"

使用tr '\n' ' '而不是 sed 命令删除 \n

如果不支持这些符号,我尝试删除向上和向下箭头 - 相同的行为。

我尝试在 RESULT 变量上使用 sed 来尝试删除新行。我还尝试将 RESULT 变量的内容写入一个新的临时 txt 文件,然后检索文件的内容并使用 grep 逐一提取结果,希望不会复制新行。没有为我工作。看起来有一些我无法删除的换行符,但我可能是错的。

我是命令行和 shell 脚本的新手。试图将我非常有限的知识应用于新场景。任何帮助,将不胜感激。

标签: shellunixterminalcommand-line-interfacezsh

解决方案


tr seems to do the job and echo -n "$UPLOAD" shows on a single line, so I think you're on the right track and only need to fix the DOWNLOAD part.

I suggest you simplify the script a bit using something along these lines:

INPUT_FILE="~/Terminal_Projects/temp_speedtest_result.txt"

DOWNLOAD="$(grep Download $INPUT_FILE | awk '{print "↓" $2 " " $3}' | tr '\n' ' ')"
UPLOAD="$(grep Upload $INPUT_FILE | awk '{print "↓" $2 " " $3}' | tr '\n' ' ')"

echo "$DOWNLOAD | $UPLOAD"

推荐阅读