sed+ はパスから最初のディレクトリを削除します。

sed+ はパスから最初のディレクトリを削除します。

sed、を介してパスから最初のディレクトリを削除する必要があります(pfが実行する操作とは対照的に)basename

例えば

echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | sed ...

私は以下を得るべきです:

/VPfig/Amer/AR4/Celtel/files/COM.txt

答え1

努力する:

echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | sed 's|^/[^/]*||'

これは私に次のことを与えます:

/VPfig/Amer/AR4/Celtel/files/COM.txt

最初の項目を見つけて//できるだけ多くのnon--を見つけて空の文字列に置き換えます。

答え2

POSIXシェルでは:

$ x='/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt'
$ printf "/%s\n" "${x#/*/}"
/VPfig/Amer/AR4/Celtel/files/COM.txt

説明する

これパラメータ拡張 ${x#/*/}パスの先行コンポーネントを削除し、/2つに囲んでprintf先行を再固定します/

答え3

最も簡単な方法は、/文字列の先頭から最短の非文字列を削除することです。

ほとんどの正規表現言語では、[ ]osは角かっこ内のすべての項目に一致する文字クラスです。またはまたはと[abc]一致します。はabc[^ ]否定的な文字クラスは、その中の文字を除くすべての項目と一致します。したがって、[^/]*最長の非文字列が一致します/^正規表現の先頭のAは、入力文字列の先頭にのみ一致するようにします。これを組み合わせると、次のことができます。

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | sed 's/^\/[^/]*//'
/VPfig/Amer/AR4/Celtel/files/COM.txt

または、awkの入力フィールド区切り文字を設定し、/最後のフィールドを除くすべてのフィールドを印刷できます。

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | 
    awk -F/ '{for(i=3;i<=NF;i++){printf "/%s",$i};print ""}'

または、いくつかのPerlトリックを使用できます。

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | 
    perl -F/ -lane 'print "/",join "/",@F[2..$#F]'
/VPfig/Amer/AR4/Celtel/files/COM.txt

またはより良いPerlトリック@Joseph R.が提案したように。:

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | perl -pe 
   perl -pe 's{^/.*?(?=/)}{}'

または簡単に言うと:

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | perl -pe 's#/[^/]+/#/#'
/VPfig/Amer/AR4/Celtel/files/COM.txt

最後に、Perl正規表現の強力な機能を使用することもできますgrep

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | grep -oP '/[^/]+?\K/.*'
/VPfig/Amer/AR4/Celtel/files/COM.txt

関連情報