2

パスからフィールドを削除する最も簡単で読みやすい方法を探しています。たとえば、/this/is/my/complicited/path/here があり、bash コマンドを使用して文字列から 5 番目のフィールド ("/complicited") を削除すると、/this/is になります。 /私の進路。私はこれを行うことができます

echo "/this/is/my/complicated/path/here" | cut -d/ -f-4
echo "/"
echo "/this/is/my/complicated/path/here" | cut -d/ -f6-

しかし、これを 1 つの簡単なコマンドで実行したいと思います。

echo "/this/is/my/complicated/path" | tee >(cut -d/ -f-4) >(cut -d/ -f6-)

これが機能しないことを除いて。

4

4 に答える 4

4

を使用cutすると、印刷するフィールドのコンマ区切りリストを指定できます。

$ echo "/this/is/my/complicated/path/here" | cut -d/ -f-4,6-
/this/is/my/path/here

したがって、実際には 2 つのコマンドを使用する必要はありません。

于 2012-04-25T14:21:07.563 に答える
0

bash スクリプトに何か問題がありますか?

#!/bin/bash        

if [ -z "$1" ]; then 
    us=$(echo $0 | sed "s/^\.\///") # Get rid of a starting ./
    echo "        "Usage: $us StringToParse [delimiterChar] [start] [end]
    echo StringToParse: string to remove something from. Required
    echo delimiterChar: Character to mark the columns "(default '/')"
    echo "        "start: starting column to cut "(default 5)"
    echo "          "end: last column to cut "(default 5)"
    exit
fi


# Parse the parameters
theString=$1
if [ -z "$2" ]; then
    delim=/
    start=4
    end=6
else
    delim=$2
    if [ -z "$3" ]; then
        start=4
        end=6
    else
        start=`expr $3 - 1`
        if [ -z "$4" ]; then
            end=6
        else
            end=`expr $4 + 1`
        fi
    fi
fi

result=`echo $theString | cut -d$delim -f-$start`
result=$result$delim
final=`echo $theString | cut -d$delim -f$end-`
result=$result$final
echo $result
于 2012-04-25T15:03:24.937 に答える
0

これにより、5 番目のパス要素が削除されます

echo "/this/is/my/complicated/path/here" | 
  perl -F/ -lane 'splice @F,4,1; print join("/", @F)'

ただ叩く

IFS=/ read -a dirs <<< "/this/is/my/complicated/path/here"
newpath=$(IFS=/; echo "${dirs[*]:0:4} ${dirs[*]:5}")
于 2012-04-25T14:30:23.573 に答える
0

sed を使用するのはどうですか。

$ echo "/this/is/my/complicated/path/here" | sed -e "s%complicated/%%"
/this/is/my/path/here
于 2012-04-25T14:10:25.213 に答える