我无法从 shell 脚本中的文本中删除新行(使用 sed 和 grep)

I am having trouble removing new lines from text in a shell script (using sed and grep)

我在 macOS 上使用 zsh

我有一个 shell 脚本,它生成一个具有以下布局的速度测试结果的文本文件:

 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 实例,因为我无法让它在一个实例中正常工作。您可能知道如何让它发挥作用。

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

我尝试过的:

使用 RESULT="$DOWNLOAD | $UPLOAD"

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

使用tr '\n' ' '代替sed命令删除\n

我尝试删除向上和向下箭头以防不支持这些符号 - 同样的行为。

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

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

tr 似乎可以完成这项工作,而 echo -n "$UPLOAD" 显示在一行中,所以我认为您走在正确的轨道上,只需要修复 DOWNLOAD 部分。

我建议您使用以下内容稍微简化脚本:

INPUT_FILE="~/Terminal_Projects/temp_speedtest_result.txt"

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

echo "$DOWNLOAD | $UPLOAD"

怎么样

RESULT="$(grep -Ew '(Down|Up)load' <~/Terminal_Projects/temp_speedtest_result.txt | tr '\n' ' ')"

?这样效率更高(只需要一个 greptr 进程)并且还通过在中使用管道修复了解决方案中的错误RESULT=$DOWNLOAD" | "$UPLOAD(本应显示错误消息)。