Linux 和 Mac 中的行尾

Linux 和 Mac 中的行尾

我正在分析一个文本文件,寻找在以“output”开头的行之后写入的路径。该线是这样的

output xyz/mypath/

我想提取xyz/mypath 没有最后的斜杠。

在我的 Mac OS X (BSD) 和 Linux 上,当我获取此路径时,我会得到不同的行为 basepath=cat $basefile | grep -e ^output\ | cut -d" " -f2 | rev | sed 's@/$@@' | rev

棘手的部分似乎是

sed 's@/$@@

它在 Mac 上有效,但在 Linux 上无效。反之亦然,如果我这样做

sed 's@/@@ 它适用于 Linux,不适用于 Mac (BSD)。

这个技巧似乎与行尾 char $ 有关,它的管理方式不同(可能在 cat 级别)。有什么建议可以以 Mac 和 Linux 控制台都能完成这项工作的方式解决这个问题吗?

答案1

我无法轻松访问 OSX 机器,但您的方法无论如何都不必要地复杂。只需执行类似以下操作(取决于您的实际输入)即可:

basepath=$(grep ^output "$basefile" | awk '{print $NF}' | sed 's/[/]$//'

或者

basepath=$(awk '/^output/{print $2}' "$basefile" | sed 's/[/]$//')

甚至

basepath=$(grep -oP '^output\s+\K.+(?=/)' "$basefile")

或者

basepath=$(perl -lne 'print $1 if /^output\s+(.+)\//' "$basefile";

答案2

据我所知,这应该在 Linux 上工作 -sed至少是声明 - 但如果你想知道 的sed模式空间中发生了什么,你应该l看看它:

sed 'l;s|/$||;l'

我认为你可以像这样完成整个事情sed

basepath=$(sed '/^output /!d;s|||;s|/$||' <"$basefile")

答案3

我建议

sed -n '/^output / {s///; s,\(.*\)/,\1,p}'

它应该适用于 GNU 和 OSX sed。

中的空正则表达式s///重新使用之前的正则表达式 ( /^output /)

相关内容