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) では動作しません。

このトリックは、異なる方法で管理される行末の文字 $ に関連しているようです (おそらく 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で何が起こっているかを知りたい場合は、次の点を確認してください。sedl

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 /

関連情報