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]
一致します。はa
b
c
[^ ]
否定的な文字クラスは、その中の文字を除くすべての項目と一致します。したがって、[^/]*
最長の非文字列が一致します/
。^
正規表現の先頭の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