我正在分析一个文本文件,寻找在以“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 /
)