私はいくつかの便利な正規表現コメントを持っていますが、私がよく使うコメントは次のとおりです。
echo '/home/user/folder/file.txt' | sed -E 's/[\\\/][^\\\/]*$//g'
この正規表現から得られた結果は親フォルダへのパスです/home/user/folder
。正規表現の基本を理解します。
\s # all white space
\S # no white space
. # all chars
\. # period
+ # sequence of once or more
{5} # sequence of delimited interval
* # sequence of zero or more
? # sequence of once or none
[0-9] # any sequence of number
[a-z] # any sequence of letter
[^x-y] # no sequence of letter
^ # beginning
$ # ending
しかし、私は正規表現の中和の意味が何であるかを私の例では理解できませんでした[\\\/]
。[^\\\/]
どのように動作しますか?
答え1
[\\\/]
エスケープ文字\
とエスケープ文字が含まれています/
(ここでは文字をエスケープする必要はありません)。[abc]
一致a
または、一致b
またはと同じです。c
[\\\/]
\
/
[^\\\/]
やや似ていますが、^
最初は特別な反転があります[]
。つまり、意味を否定します。[^\\\/]
任意の文字に一致その他または\
。/
[\\\/][^\\\/]*$
\
または と一致し、/
行末までゼロ個以上の他の文字と一致します。あなたのs
コマンドは一致する文字列を何も変更しません。完全なsedコマンドは、最後の項目または\
最後の/
項目(後のいずれかの項目)とそれ以降のすべての項目を削除します。
メモ:
-E
この特定のコマンドは機能する必要はありません。g
必要ありません(1行に複数の行が見つかりません)。- (既に指摘)
/
内に脱出する必要はありません。[]
(外部エスケープは/
通常必要ありません。人々は特にから区切り文字として選択するため、通常必要ですが、たとえば他の文字でもかまいません。)[]
/
s/…/…/
s|…|…|
/
あなたのコマンドは、Unixパス名(コメントで区切られています)とDOS / Windowsパス名(コメントで区切られています)の両方から\
最後のコンポーネントを削除するという点で「汎用」です。しかし…\
Unix パス名に表示されることがあります。その場合、sed コマンドによって予期しない結果が表示されることがあります。改行も許可されます。/
有効なパス名です。親ディレクトリは次のとおりです。/
。ただし、sedコマンドは空の文字列を生成します。dir
ディレクトリの場合は/path/to/dir/
同じです/path/to/dir
が、sedコマンドは/path/to/dir
それぞれ/path/to
。