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 等級)。

答案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 /)

相關內容