2

PATH特定の要素が削除されるように、変数をフィルタリングしています (以下の例では、 string を含む要素x86です。実際には string を探していますsite-packages)。

$ echo $(IFS=:;arr=($PATH);echo "${arr[*]//*x86*}")
/usr/local/bin:/usr/bin:/cygdrive/c/Program Files/Common Files/Microsoft Shared/Windows Live::/cygdrive/c/Program Files/Lenovo Fingerprint Reader:::/cygdrive/c/Program Files/Intel/iCLS Client:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdrive/c/Windows/System32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0:/cygdrive/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/cygdrive/c/Program Files/Intel/Intel(R) Management Engine Components/IPT:::::/cygdrive/c/Program Files/Intel/WiFi/bin:/cygdrive/c/Program Files/Common Files/Intel/WirelessCommon:/cygdrive/c/Program Files/Common Files/Lenovo:::/cygdrive/c/SWTOOLS/ReadyApps:::::/usr/lib/lapack

これは非常にうまく機能しますが、ゼロに設定されたすべての要素はまだそこにありますが、空です。最終的にこれらの要素を排除したいと考えており、そのために bash 以外は使用したくありません ( を使用できることはわかっていますtrが、移植性の理由から、bash のみのソリューションを強くお勧めします)。

tr ベースのソリューションは次のとおりです。

echo $(IFS=:;arr=($PATH);echo "${arr[*]//*x86*}" | tr -s :)

更新: パス要素内のスペース (またはコロン以外のもの) に直面しても堅牢になりたいため、配列を使用しています。

4

4 に答える 4

3

それについてもっと明確にする必要があります:

PATH=$(
  IFS=:
  new=()
  for p in $PATH; do
    [[ $p != *x86* ]] && new+=("$p")
  done
  echo "${new[*]}"
)

より冗長ですが、要求に応じて正確で bash のみです

于 2013-11-08T18:24:04.637 に答える
0

コンスティチュエントにスペースが含まれていないと仮定すると、これはで機能するはずPATHなので、他のソリューションよりも明らかに脆弱です。arr2空の配列要素は割り当ての時点で破棄されます

echo $(IFS=:;arr=($PATH);unset IFS;arr2=(${arr[@]//*x86*});IFS=:;echo "${arr2[*]}")
于 2013-11-08T19:11:10.010 に答える