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@/@@ Mac(BSD)ではなくLinuxで動作します。

このトリックは行末の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知りたい場合は、次の点を見てください。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 /)。

関連情報