7

私はシェルスクリプトを初めて使用し、次のことを達成しようとしています.WindowsパスをLinuxパスに変換し、その場所に移動します:

入力:cdwin "J:\abc\def" アクション:cd /usr/abc/def/

というわけで、以下を変更します。

"J:" -> "/usr"

"\" -> "/"

これは私の試みですが、うまくいきません。エコーすると空白が返されます:

function cdwin(){
    line="/usrfem/Projects$1/" | sed 's/\\/\//g' | sed 's/J://'
    cd $line
}
4

4 に答える 4

11

変数をキャッチしてから処理する必要があります。

たとえば、これは次のようになります。

function cdwin(){
    echo "I receive the variable --> $1"
    line=$(sed -e 's#^J:##' -e 's#\\#/#g' <<< "$1")
    cd "$line"
}

そして、あなたはそれを

cdwin "J:\abc\def"

説明

コマンド

line=$(sed -e 's#^J:##' -e 's#\\#/#g' <<< "$1")

と同等です

line=$(echo $1 | sed -e 's#^J:##' -e 's#\\#/#g')

\everyをに置き換え/、結果を var に保存しlineます。#読みやすくするために、別の区切り文字 を使用していることに注意してください。また、先頭の も削除しJ:ます。

于 2013-11-15T11:09:20.513 に答える
3

sed では代替区切り文字が許可されるため、使用しない方がよいでしょう/

この sed コマンドを試してください:

sed -e 's~\\~/~g' -e 's~J:~/usr~' <<< "$line"
于 2013-11-15T11:03:50.187 に答える
2

sed を使用する必要さえありません (ただし、sed を使用しても問題はありません)。これは、bash文字列置換を使用して機能します:

function cdwin() {
  line=${1/J://usr}
  line=${line//\\//}
  cd "$line"
}

cdwin 'J:\abc\def'

置換は次のように機能します (簡略化)。

${var/find/replace} 

ダブルスラッシュはすべてを置き換えることを意味します:

${var//findall/replace}

引数で、 の最初のインスタンスをに1置き換えます。J:/usr

${1/J://usr}

variable で、すべての ( ) バックスラッシュ (エスケープ、) を ( )スラッシュ ( )lineに置き換えます。//\\//

${line//\\//}

それらの出力をエコーし​​て、それらがどのように機能するかを確認します

于 2017-10-27T13:30:04.540 に答える