
私はテキストファイルを分析して、「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
で何が起こっているかを知りたい場合は、次の点を確認してください。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 /