
我正在分析一個文字文件,尋找在以“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 /
)